我有一个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_BUTTON
得到的字符串都是unicode字符串,6
个字符都很长,两者都等于"Button"
,地球上的字符是{{{ 1}}返回if (cls == WC_BUTTON)
??
有人可以解释两个看似完全相同的字符串是如何彼此相等的吗?
或者我如何确定false
是否属于按钮/编辑/等。控制?
答案 0 :(得分:4)
您不是在比较字符串,而是在比较地址。由于地址不同,因此返回false
。
由于您需要在缓冲区中填写函数,因此您有两个主要选项:
a)使用C字符串和_tcscmp
(strcmp
的TCHAR版本):
if (_tcscmp(cls, WC_BUTTON) == 0) //0 means equal
b)使用容器。 std::vector
和std::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
可以访问cls.c_str()
的常量C字符串版本。
请注意,我已更改了GetClassName
调用以反映这样一个事实,即它需要缓冲区的长度(以字符为单位),而不是以字节为单位的大小。 TCHAR
的大小可能不是一个,所以有必要除以它。