奇怪的不等式 - WC_BUTTONW不等于 L "Button" ?
Strange inequality - WC_BUTTONW not equal to L"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"
, if (cls == WC_BUTTON)
返回false
?
有人可以解释两个看似完全相同的字符串与彼此之间的相同吗?还是如何确定HWND
是否属于按钮/编辑/等。控制?
您没有比较字符串,而是要比较地址。由于地址不同,因此返回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.c_str()
访问cls
的常数C字符串版本。
请注意,我已经更改了您的GetClassName
调用,以反映出它占用缓冲区的字符,而不是字节中的大小。TCHAR
的大小可能不是一个,因此有必要对此进行划分。
相关文章:
- 为什么 std::round(sin(pi/6)) 不等于 1?
- 你怎么编码,如果x不等于一个数字,程序就会退出
- u张量模型输出不等于预期输出
- 虽然不等于陈述和/或差异
- 这种关系不等于定义良好的表达式吗?
- OpenGL 版本不等于支持的着色器版本
- 两个 4 位位字段加起来不等于一个字节的大小 - 如何修复?
- 如果整数不等于 0,则将其减小为 1
- C 循环虽然不等于任何两个值
- vb.net单不等于c float
- 如何获取C编译器#Error如果大小(struct ..)不等于给定的数字
- C++ 而语句不等于检查
- 有没有办法检查int是否不等于数组中的所有值?(C )
- 整数数组中的元素数量不等于其大小
- 获取不等于特定值的向量的第一个N元素
- 使用 boost 解析符号链接时,结果不等于原始路径名
- 什么是有效的检查:等于或不等于
- 发送的字节不等于C 套接字PRG中的接收字节
- 奇怪的不等式 - WC_BUTTONW不等于 L "Button" ?
- 为什么向导Wiz0;不等于向导Wiz0();在我的代码中?C2228错误