Unicode工具提示不显示

我试图在我的应用程序窗口中显示unicode工具提示,但他们似乎并没有显示。 非Unicode文本正确显示,但只要我尝试做Unicode,没有工具提示出现。 以下是我目前正在做的,任何帮助表示感谢。

HWND parentHwnd = pickInfo->getViewer().getCachedHwnd(); CWnd *pWnd = CWnd::FromHandlePermanent(parentHwnd); HINSTANCE hInstance = GetModuleHandle(NULL); if (isUnicode) m_toolInfoW.lpszText = L"This tooltip does not show up at all."; else m_toolInfoA.lpszText = "Non unicode text"; if (!m_bTooltipInitialized){ ::SendMessage(m_tooltipHwnd, WM_DESTROY, 0,0); if(isUnicode) m_tooltipHwnd = CreateWindowExW(WS_EX_TOPMOST, TOOLTIPS_CLASSW, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, parentHwnd, NULL, hInstance, NULL); else m_tooltipHwnd = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, parentHwnd, NULL, hInstance, NULL); if (GetLastError() != 0) return; ::SetWindowPos(m_tooltipHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); // Set the max text width before multi-line tooltip is used. ::SendMessage(m_tooltipHwnd, TTM_SETMAXTIPWIDTH, 0, m_nMaxWinTooltipWidth); if (isUnicode){ m_toolInfoW.uFlags = TTF_SUBCLASS | TTF_IDISHWND | TTF_TRACK; m_toolInfoW.hinst = hInstance; m_toolInfoW.hwnd = parentHwnd; m_toolInfoW.uId = (UINT_PTR)parentHwnd; ::GetClientRect (parentHwnd, &m_toolInfoW.rect); ::SendMessage(m_tooltipHwnd, TTM_ADDTOOLW, 0, (LPARAM) (LPTOOLINFOW) &m_toolInfoW); ::SendMessage(m_tooltipHwnd, TTM_ACTIVATE, TRUE, (LPARAM)(LPTOOLINFOW) &m_toolInfoW); } else{ m_toolInfoA.uFlags = TTF_SUBCLASS | TTF_IDISHWND; m_toolInfoA.hinst = hInstance; m_toolInfoA.hwnd = parentHwnd; m_toolInfoA.uId = (UINT_PTR)parentHwnd; ::GetClientRect (parentHwnd, &m_toolInfoA.rect); ::SendMessage(m_tooltipHwnd, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &m_toolInfoA); ::SendMessage(m_tooltipHwnd, TTM_ACTIVATE, TRUE, (LPARAM)(LPTOOLINFO) &m_toolInfoA); } m_bTooltipInitialized = true; } if (isUnicode) ::SendMessage(m_tooltipHwnd, TTM_UPDATETIPTEXTW, 0, (LPARAM) (LPTOOLINFOW) &m_toolInfoW); else ::SendMessage(m_tooltipHwnd, TTM_UPDATETIPTEXT, 0, (LPARAM) (LPTOOLINFO) &m_toolInfoA); //Repaint the screen so that the area beneath the previous location of the tooltip is restored correctly. ::UpdateWindow(pWnd->GetParentOwner()->GetSafeHwnd()); pWnd = NULL; 

Solutions Collecting From Web of "Unicode工具提示不显示"

问题是您尝试使用通用控件版本6,但是您无法使用它。

更详细地说,

 typedef struct tagTOOLINFOW { UINT cbSize; UINT uFlags; HWND hwnd; UINT_PTR uId; RECT rect; HINSTANCE hinst; LPWSTR lpszText; LPARAM lParam; #if (NTDDI_VERSION >= NTDDI_WINXP) void *lpReserved; #endif } TTTOOLINFOW, NEAR *PTOOLINFOW, *LPTTTOOLINFOW; 

对于xp +,头文件CommCtrl.h假定你会使用comctl版本6,但是如果你没有使用清单文件明确启用它,你仍然会使用旧的comctl版本5.x。 那么问题来了,版本5.x的TOOLINFO的大小与版本6.x不同。

所以如果你需要在windows xp +下使用comctl version 5,你应该用下面的代码来初始化TOOLINFO,

 TOOLINFO ti; ti.cbSize = sizeof(TOOLINFO) - 4; 

否则,应该使用清单文件或prgram指令启用视觉样式的外观:

 #pragma comment(linker,"\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

最后,我建议你总是在xp +中启用视觉效果。 这里是视觉效果的比较:

共同控制5.x

共同控制6.x

注意:如果使用ANSI / MBCS编译程序,sizeof(TOOLINFO)将是48,已经删除了lpReserved成员。 所以ANSI版本会起作用,但是UNICODE会失败。

在Unicode情况下你有TTF_TRACK ,我相信你需要手动显示或隐藏工具提示。 在ANSI的情况下,你没有这个选项。

http://msdn.microsoft.com/en-us/library/bb760252(VS.85).aspx

向下滚动到“实施跟踪工具提示”。

好的解释和解决方案,将由上面的Jichao工作,但硬连接TOOLINFO结构的大小将只修复工具提示。 如果问题是程序是用6.0+以上的通用控件编译的,但是可以运行在(比方说)有6.0+的Windows XP系统上,或者没有安装,或者没有完全安装(就像某人安装了IE,但是从来没有使用过更新它),那么更一般的解决方案是限制应用程序只使用5.x通用控件。

从这里可以看出,结构尺寸变化的东西比工具提示更多。

我做了什么来确保在Windows XP上的一切都可以在我的程序的最上面放到下面的位置(在Visual Studio的情况下,如果你有一个好的地方,一):

 #define _WIN32_WINNT 0x0500