2015-10-19 59 views
0

我的应用程序之一是从Windows XP移植到WIN7。对于此应用程序工具提示控件在XP中工作时无法在win7中工作。工具提示不是控件

代码逻辑:

我们正处在一个常量字符串设定提示。 aToolTipText =anImageTypeStr; 并传入一个函数​​,该函数调用ActivateToolTipText(int Id, bool activateFlag),它实际上是基于id处理Tooltip。

bool ActivateToolTipText(int Id, bool activateFlag) 
{ 

CSA_TRY 
{ 
    // struct specifying info about tool in ToolTip control 
    TOOLINFO ti; 
    unsigned int uid = Id;  // for ti initialization 

    LPTSTR lptstr = (LPTSTR)(LPCTSTR)m_strToolTipText[Id]; 

    // CREATE A TOOLTIP WINDOW 
    if(activateFlag) 
    { 
     m_ToolTipHWND[Id] = CreateWindowEx(WS_EX_TOPMOST, 
      TOOLTIPS_CLASS, 
      NULL, 
      WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,   
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      m_hWnd, 
      NULL, 
      0, 
      NULL 
      ); 
    } 

    // INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE 
    ti.cbSize = sizeof(TOOLINFO); 
    ti.uFlags = TTF_SUBCLASS ; 
    ti.hwnd = m_hWnd; 
    ti.hinst = 0; 
    ti.uId = uid; 
    ti.lpszText = lptstr; 
    // ToolTip control will cover the rect of Id 
    CRect rect_out; 
    GetIdArea(Id, &rect_out); 
    ti.rect = rect_out; 

    if(activateFlag) 

     ::SendMessage(m_ToolTipHWND[Id], TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO)&ti); 

    } 
    else 
    { 
     ::SendMessage(m_ToolTipHWND[Id], TTM_DELTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); 
    } 


    return TRUE; 
} 
} 
+1

你在调试器中运行你的代码吗?这可能会揭示问题。只需逐句通过声明并查看是否所有的ID和指针都已正确初始化。问题很可能不在您所显示的代码中,而在您的程序的其他部分中可能与工具提示设施无关。 – nv3

+0

我已经调试了代码和工具提示字符串和ID ID设置正确的工具提示结构。 此外,我注意到使用spy ++后,鼠标移动TTM_RELAYEVENT不是由OLE调用bieng。为什么它不在Windows 7中,而相同的代码正在为XP工作。请提出解决此问题的任何解决方法或根本原因。 – sachin

+0

我得到了解决方案: 更改ti.cbSize = sizeof(TOOLINFO); to ti.cbSize = sizeof(TOOLINFO) - 4; – sachin

回答

0

问题是与通用控件为XP +,头文件CommCtrl.h假设我们使用COMCTL 6版第6版,但如果我们不使用清单文件显式地启用它,我们仍然使用旧的comctl版本5.x.问题从这里开始,版本5.x的TOOLINFO的大小与版本6.x不同。所以如果你需要在windows xp +下使用comctl version 5,你应该使用下面的代码TOOLINFO ti来初始化TOOLINFO; ti.cbSize = sizeof(TOOLINFO) - 4;