我在使用unicode格式的動態文本提供Win32工具提示控件方面遇到了一些麻煩。我用下面的代碼來設置控制:如何使用動態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
提供一個字符數組,但隨後沒有Unicode支持...)
我猜我做錯了什麼在我的設置或信息處理嗎?有關如何正確執行此操作的任何建議?
更新
另外請注意,我的項目是不是在unicoe編譯模式(沒有定義,即_UNICODE和項目設置爲使用多字節字符集)。這是故意的,我想保留它,因爲我不想將整個應用程序重寫爲unicode意識(至少現在還沒有)。由於_UNICODE定義用於選擇* W版本的各種函數和數據結構,我希望能夠通過在我的代碼中明確使用這些結果來達到相同的結果,如上所示。
很可能是正確的解決方案,我即將張貼相同。 Windows內部是Unicode,但是在運行MBCS(又名ANSI又名Windows95)應用程序時會編入API參數。 – MSalters 2009-06-15 08:01:19