2012-10-17 77 views
1

我有一個按鈕控制包裝類,它允許您傳遞一個現有的句柄,只要它是WC_BUTTON類。我用GetClassName()來確定這一點。但我有一個問題,在代碼中的註釋應有助於形容它:奇怪的不平等 - WC_BUTTONW不等於L「Button」?

// Initialize from existing handle 
Vivify::Button::Button(HWND handle) { 
    TCHAR cls[256]; 
    GetClassName(handle, cls, sizeof(cls)); 

    Alert(cls);  // MessageBox says "Button" 
    Alert(WC_BUTTON); // MessageBox says "Button" also 

    Str clsStr = cls; 
    Str wcStr = WC_BUTTON; 

    Alert(ToStr<int>(clsStr.length())); // says "6" 
    Alert(ToStr<int>(wcStr.length())); // says "6" also 

    // Problem HERE. Evaluates to false. How are they inequal?? 
    if (cls == WC_BUTTON) { 
     SetHandle(handle); // Never gets executed 
     m_id = GetDlgCtrlID(handle); 
    } 
} 

Strstd::wstring的方式,程序是用Unicode。 但兩者的字符串,我從GetClassName()獲取和WC_BUTTON都是Unicode字符串,都6字符,都等於"Button",如何在地球上是返回falseif (cls == WC_BUTTON)

有人可以解釋兩個看起來完全相同的字符串可以相等嗎? 或者我怎樣才能確定一個HWND屬於一個按鈕/編輯/等。控制?

+4

不要將C字符串與==比較。 – chris

+0

@chris那我該如何比較呢? –

+2

如果仍然是C字符串,則爲'strcmp'。因爲'vector '和'array '可以像C字符串一樣工作,所以你也可以使'cls'成爲另一個,並設置'data()'爲'WC_BUTTON',並使用==。我會說'std :: string',但是你不能直接設置它的緩衝區。 – chris

回答

4

你沒有比較字符串,你正在比較地址。由於地址不同,所以返回false

既然你需要有緩衝功能填充,你有兩個主要選擇:

一)使用C字符串和_tcscmp(該TCHAR版本的strcmp):

if (_tcscmp(cls, WC_BUTTON) == 0) //0 means equal 

B)使用容器。 std::vectorstd::array可讓您編輯緩衝區,與std::string不同,但我會顯示後者。

TCHAR clsTemp[256]; 
GetClassName(handle, clsTemp, sizeof clsTemp/sizeof(TCHAR)); 
std::basic_string<TCHAR> cls = clsTemp; 

if (cls == WC_BUTTON) //WC_BUTTON converted to `std::string` to compare 

cls常數C字符串版本然後可以通過cls.c_str()訪問。

請注意,我已更改您的GetClassName調用,以反映它以緩衝區的字符長度而不是字節爲單位的事實。 TCHAR的大小可能不是一個,所以有必要除以。

+0

+1正確解釋爲什麼我試圖做的事情沒有奏效,並給出了2個選項。還指出了我的代碼中的另一個缺陷,並對其進行了更正。好答案。 –