微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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); if(isUnicode) m_tooltipHwnd = CreateWindowExW(WS_EX_TOPMOST,TOOLTIPS_CLASSW,NULL,WS_POPUP | TTS_nopREFIX | TTS_ALWAYSTIP,CW_USEDEFAULT,parentHwnd,hInstance,NULL); else m_tooltipHwnd = CreateWindowEx(WS_EX_TOPMOST,TOOLTIPS_CLASS,NULL); if (GetLastError() != 0) return; ::SetwindowPos(m_tooltipHwnd,HWND_TOPMOST,SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); // Set the max text width before multi-line tooltip is used. ::SendMessage(m_tooltipHwnd,TTM_SETMAXTipwIDTH,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,(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,(LParaM) (LPTOOLINFO) &m_toolInfoA); ::SendMessage(m_tooltipHwnd,(LParaM)(LPTOOLINFO) &m_toolInfoA); } m_bTooltipInitialized = true; } if (isUnicode) ::SendMessage(m_tooltipHwnd,TTM_UPDATETIPTEXTW,(LParaM) (LPTOOLINFOW) &m_toolInfoW); else ::SendMessage(m_tooltipHwnd,TTM_UPDATETIPTEXT,(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;

C + +铸造基地和“覆盖”vptr问题

可以通过使用System.IO库来读取文件来执行病毒吗?

如果使用c#如果探测器插入USB端口,如何检测?

打印字符数组垃圾

使用c + +的安全套接字连接

问题是您尝试使用通用控件版本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 +中启用视觉效果。 这里是视觉效果的比较:

注意:如果使用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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐