2009-06-14 76 views
0

我在使用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.lpszTextLPSTR_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版本的各種函數和數據結構,我希望能夠通過在我的代碼中明確使用這些結果來達到相同的結果,如上所示。

回答

3

感謝您的羅伯特斯科特鏈接。我現在找到了解決這個問題的方法。

總之,訣竅是確保接收窗口是一個unicode窗口併爲其註冊一個unicode窗口過程。

問題是我的父窗口沒有處理TTN_GETDISPINFOW通知消息的unicode WindowProc()。由於此窗口(類)是使用RegisterClassEx()/CreateWindowEx()而不是RegisterClassExW()/CreateWindowExW()創建的,因此它沒有爲unicode消息註冊窗口過程。

爲了避開發送TTM_ADDTOOLW時,導致該控件的窗口過程中receving通知,而不是其父我改變ti.hwndhwnd_mainhwnd_control問題。爲了攔截現在發送到控件窗口過程的unicode事件,我使用SetWindowLongW(hwnd_control,GWL_WNDPROC,(LONG)NewControlWndProc)對其進行了分類。

注意hwnd_control是一個標準的「LISTBOX」與CreateWindowExW(創建)窗口,因此是unicode的,因爲所有buildt的Windows類在Unicode和ANSI版本由系統自動註冊。

+1

很可能是正確的解決方案,我即將張貼相同。 Windows內部是Unicode,但是在運行MBCS(又名ANSI又名Windows95)應用程序時會編入API參數。 – MSalters 2009-06-15 08:01:19

3

您獲得TTN_GETDISPINFO通知代碼但不TTN_GETDISPINFOW表明你的項目設置爲「使用多字節字符集」的事實。

檢查項目屬性頁面:「配置屬性」 - >「常規」 - >「字符集」
此屬性應設置爲「使用Unicode字符集」。