我在使用 unicode 格式的动态文本提供 Win32 工具提示控件时遇到了一些麻烦。我使用以下代码来设置控件:
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
来提供一个 char 数组,那么它就可以工作,但是没有 unicode 支持......)
我猜我在这里的设置或消息处理中做错了什么?有关如何正确执行此操作的任何建议?
更新
另请注意,我的项目不是在 unicoe 模式下编译的(即未定义 _UNICODE 并且项目设置为使用多字节字符集)。这是故意的,我想保持这种状态,因为我不想重写整个应用程序以支持 unicode(至少现在还没有)。由于 _UNICODE 定义用于选择各种函数和数据结构的 *W 版本,我希望通过在我的代码中显式使用这些实现相同的结果,如上所示。