奇怪的不等式 - WC_BUTTONW不等于 L "Button" ?

Strange inequality - WC_BUTTONW not equal to L"Button"?

本文关键字:不等于 Button BUTTONW 不等式 WC      更新时间:2023-10-16

我有一个按钮控制包装类别,只要它是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);
    }
}

Strstd::wstring,顺便说一句,程序在Unicode中。但是我从GetClassName()WC_BUTTON获得的字符串都是Unicode字符串,均为6字符,并且都相等的"Button"if (cls == WC_BUTTON)返回false

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

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

由于您需要在缓冲区中填充功能,因此您有两个主要选择:

a)使用C字符串和_tcscmpstrcmp的TCHAR版本):

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

b)使用容器。std::vectorstd::arraystd::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_str()访问cls的常数C字符串版本。

请注意,我已经更改了您的GetClassName调用,以反映出它占用缓冲区的字符,而不是字节中的大小。TCHAR的大小可能不是一个,因此有必要对此进行划分。