2015-10-19 33 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;