У меня есть класс-оболочка для элемента управления 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
обе строки Юникод, оба 6
символы длинные, и оба равны "Button"
как черт if (cls == WC_BUTTON)
возврате false
??
Может ли кто-нибудь объяснить, как две, казалось бы, абсолютно идентичные строки могут быть равны друг другу?
Или как я могу определить, является ли HWND
принадлежит кнопке / редактировать / и т.д. контроль?
Вы не сравниваете строки, вы сравниваете адреса. Поскольку адреса разные, он возвращает false
,
Поскольку вам нужно, чтобы функция заполняла буфер, у вас есть два основных варианта:
а) Используйте строки C и _tcscmp
(версия TCHAR strcmp
):
if (_tcscmp(cls, WC_BUTTON) == 0) //0 means equal
б) Используйте контейнер. 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
Константная строковая версия C cls
может быть получен доступ cls.c_str()
,
Обратите внимание, что я изменил ваш GetClassName
вызов, чтобы отразить тот факт, что он принимает длину в символах буфера, а не размер в байтах. TCHAR
Размер не может быть один, поэтому необходимо разделить на это.
Других решений пока нет …