2010-06-10 93 views
1

我想給我的ComboBox提供長字符串的工具提示。但是,當我在工具提示上調用SetWindowPos時,位置永遠不會改變。被接收時TTN_SHOW稱爲:如果刪除了標誌SWP_NOSIZE和流行在一些值寬度/高度SetWindowPos對工具提示沒有影響

::SetWindowPos(textTooltip, NULL, TipRect.left, TipRect.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); 

,然後在組合框改變大小於這些值,但位置保持相同。 SetWindowPos總是返回TRUE。

尖端初始化像這樣:

 textTooltip = CreateWindowEx(WS_EX_TRANSPARENT, TOOLTIPS_CLASS, NULL, TTS_NOPREFIX, 0, 0, 0, 0, this->GetSafeHwnd(), NULL, NULL, NULL); 
     if(!textTooltip) 
      return; 

     ZeroMemory(&ToolInfo, sizeof(TOOLINFO)); 
     ToolInfo.cbSize = sizeof(TOOLINFO); 
     ToolInfo.uFlags = TTF_TRANSPARENT | TTF_SUBCLASS; 
     ToolInfo.hwnd = this->GetSafeHwnd(); 
     ToolInfo.lpszText = "place holder"; //set in OnSelectChangeOk 
     ToolInfo.uId = 0; 
     ToolInfo.rect = TipRect; //rect is re-set in OnSelectChangeOk 

     ::SendMessage(textTooltip, TTM_ADDTOOL, 0, (LPARAM)&ToolInfo); 

我缺少的東西?

+0

呀,你缺少的是檢查返回值並調用GetLastError()可找出什麼是錯的代碼。 – 2010-06-10 15:45:24

+0

我在發佈時刪除了大部分錯誤檢查,以使其更清潔一些。如後所述,SetWindowsPos返回TRUE,因此GetLastError()返回0.對SendMessage的調用也返回TRUE。謝謝。 – Andrew 2010-06-11 05:25:04

回答

1

你必須做::SendMessage(hToolWnd, TTM_TRACKPOSITION, 0, MAKELPARAM(x, y));並在ToolInfo.uFlags成員中設置TTF_ABSOLUTE標誌!

富勒更多信息,請訪問:http://msdn.microsoft.com/en-us/library/bb760422(VS.85).aspx

+0

這不需要我手動顯示/隱藏工具提示嗎? TTF_ABSOLUTE要求TTF_TRACK也被設置,這意味着我必須使用TTM_TRACKACTIVE和TTM_TRACKPOSITION。我已經考慮過這種方法,可能會檢查WM_MOVE消息,然後顯示提示,但比我希望的有點骯髒。我從http://blogs.msdn.com/b/oldnewthing/archive/2006/06/26/647365.aspx?PageIndex=2和http://msdn.microsoft.com/en-us/開始實施我的實施庫/ bb760252(VS.85).aspx#tooltip_sample_inplace – Andrew 2010-06-11 05:38:34

+0

好的..我的代碼被用於氣球工具提示,它總是應該彈出一個指定的位置。您是否還收到TTN_SHOW通知後發送TTM_ADJUSTRECT並返回TRUE,如同您提到的文章中所述?返回TRUE後的註釋稱「禁止默認定位」,所以你可能忘記了這一點? – humbagumba 2010-06-11 06:45:11

+0

是的,返回TRUE阻止爲消息調用標準例程。我現在採取了一個稍微不同的路線,我打電話給TrackMouseEvent獲取ON_WM_MOUSEHOVER消息,然後在懸停時手動移動並顯示工具提示。不是很乾淨,但它似乎能完成這項工作。 – Andrew 2010-06-14 06:41:14