У меня возникли проблемы с установкой инструментальной панели Win32 с динамическим текстом в формате Unicode. Я использую следующий код для настройки управления:Как настроить управление всплывающей подсказкой Win32 с динамическим текстом Unicode?
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(INITCOMMONCONTROLSEX);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);
HWND hwnd_tip = CreateWindowExW(0, TOOLTIPS_CLASSW, NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hinst, NULL
);
SetWindowPos(hwnd_tip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
TOOLINFOW ti;
memset(&ti, 0, sizeof(TOOLINFOW));
ti.cbSize = sizeof(TOOLINFOW);
ti.hwnd = hwnd_main;
ti.uId = (UINT) hwnd_control;
ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
ti.lpszText = L"This tip is shown correctly, including unicode characters.";
SendMessageW(hwnd_tip, TTM_ADDTOOLW, 0, (LPARAM) &ti);
Это прекрасно работает до тех пор, как я представить текст подсказки в ti.lpszText
. Тем не менее, я хочу, чтобы текст был динамичным, так что вместо этого я поставил ti.lpszText
в LPSTR_TEXTCALLBACKW
и обработках обратного вызова в моем WindowProc(), как это:
...
case WM_NOTIFY:
{
NMHDR *nm = (NMHDR *) lParam;
switch (nm->code)
{
case TTN_GETDISPINFOW:
{
static std::wstring tip_string = L"Some random unicode string.";
NMTTDISPINFOW *nmtdi = (NMTTDISPINFOW *) lParam;
nmtdi->lpszText = (LPWSTR) tip_string.c_str();
}
break;
}
}
break;
...
Который не работает, так как я никогда не получить TTN_GETDISPINOW
сообщений. (Примечание: Это работает, если я обрабатывать TTN_GETDISPINFO
вместо этого и использовать NMTTDISPINFO
, чтобы обеспечить массив символов, но без поддержки Юникода ...)
Я предполагаю, что я делаю что-то неправильно в моей установке или обработки сообщений здесь? Любые предложения о том, как сделать это правильно?
Update
отметить также, что мой проект не компилируется в unicoe режиме (т.е. _UNICODE не определен, и проект настроен на использование многобайтную набор символов). Это намеренно, и я хотел бы сохранить его таким образом, поскольку у меня нет желания переписывать все приложение в формате unicode (по крайней мере, пока). Поскольку определение _UNICODE используется для выбора * W-версий различных функций и структур данных, я надеялся, что смогу достичь такого же результата, используя это явно в моем коде, как показано выше.
Скорее всего, правильное решение, я собирался опубликовать то же самое. Windows внутренне является Unicode, но будет аргументировать аргументы API при запуске приложения MBCS (aka ANSI aka Windows95). – MSalters