1

我有一个 Button 控件包装类,它允许您将现有句柄传递给它,前提是它属于WC_BUTTON该类。我GetClassName()用来确定这一点。但是我有一个问题,代码中的注释应该有助于描述它:

// 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);
    }
}

Str顺便说一句std::wstring,程序是Unicode。但是我得到的字符串GetClassName()都是WC_BUTTONunicode 字符串,都是6字符长,而且都相等"Button",到底线是如何if (cls == WC_BUTTON)返回的false

有人可以解释两个看似完全相同的字符串如何彼此不相等吗?或者我如何确定 a 是否HWND属于按钮/编辑/等。控制?

4

1 回答 1

4

您不是在比较字符串,而是在比较地址。由于地址不同,因此返回false.

由于您需要让函数填充缓冲区,因此您有两个主要选择:

a) 使用 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的大小可能不是一,所以有必要除以它。

于 2012-10-18T00:26:37.230 回答