2010-03-30 79 views
4

我想在我的应用程序窗口中显示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; 

回答

1

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

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

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

+0

感谢您的注意。你是对的,不应该在那里,当我测试的时候,我忘了删除它。但是,这并不能解决我的问题。没有这个标志,仍然没有工具提示出现。 – Martin 2010-03-30 14:15:08

+0

父窗口是否也是Unicode?也许在使用Unicode工具提示和ANSI父窗口之间存在不兼容问题。 – 2010-03-31 17:44:39

6

问题是,您尝试使用通用控件版本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不同。

所以,如果你需要使用COMCTL 5版在Windows XP +,你应该初始化TOOLINFO与follwing代码,

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 +中启用视觉效果。这里有视觉效果的对比:

common controls 5.x

common controls 6.x

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

+1

非常感谢。我正在尝试使用VS2008在MSDN上的简单工具提示示例代码,但很快就遇到了ANSI构建出现的工具提示问题,但Unicode构建从来没有这样做。发送TTM_ADDTOOL返回0(失败)。我通过谷歌搜索来到你的帖子,并得到确切的答案。来自微软的巨大利益!但我仍然无法解释为什么ANSI构建不会触发错误。如果M $ comctl32 pre-6.0代码检查调用程序中不兼容的'TOOLINFO.cbSize',则ANSI和Unicode应显示相同的行为。 – 2015-11-13 16:08:22

1

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

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

我所做的一切都是为了确保Windows XP上的所有功能都可以在我的程序的最顶端放入任何包含之前(在visual studio的情况下,一个好的地方将位于targetver的顶部)。如果你有一个):

#define _WIN32_WINNT 0x0500