Странное неравенство — WC_BUTTONW не равен L & quot; Кнопка & quot ;?

У меня есть класс-оболочка для элемента управления 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 принадлежит кнопке / редактировать / и т.д. контроль?

1

Решение

Вы не сравниваете строки, вы сравниваете адреса. Поскольку адреса разные, он возвращает 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Размер не может быть один, поэтому необходимо разделить на это.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]