2010-06-10 51 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