用 Windows API实现自己的多行文本的ToolTip

CToolTipCtrl使用的时候,需要在窗口的PreTranslateMessage中调用它的DelayEvent.
但 是有时候我们的窗口中的PreTranlateMessage不会被调用,那怎么办?

1. 调用CreateWindowEx创建自己的ToolTip窗口,并作相应的设置

    
::InitCommonControls();
      hToolTip = ::CreateWindowEx(0, “tooltips_class32”,
_T(""), TTS_ALWAYSTIP, 0, 0, 0, 0, hWnd, 0,
::AfxGetApp()->m_hInstance, 0);

      LONG delayTime;
      delayTime = 20000;
  
      ::SendMessage(hToolTip, TTM_SETMAXTIPWIDTH, 0,
240);
      ::SendMessage(hToolTip, TTM_SETDELAYTIME, (ttDelayReshow
& ttDelayMask), delayTime);

2.  为需要显示ToolTip的字窗口添加ToolTip

  
TOOLINFO ti;
   ti.cbSize = sizeof(ti);
   
   if( !GetToolTipInfo(hSubWnd, ti) )
   {
        ti.cbSize = sizeof(ti);
        ti.uFlags = TTF_SUBCLASS |
TTF_IDISHWND;
        ti.hwnd = hParent;
        ti.uId = (long)hSubWnd;
        ti.lpszText = NULL;
        ::SendMessage(hToolTip, TTM_ADDTOOL,
0, (LPARAM)&ti);

}

3. 设置需要显示的ToolTip文本

  TOOLINFO
ti;
    if( GetToolTipInfo(hSubWnd, ti) )
    {

       
ti.lpszText = new TCHAR[strText.GetLength()+1]; //
之前在strText 中插入相应的位置换行符
        wcscpy(ti.lpszText,
strText.GetBuffer());
        ::SendMessage( hToolTip,
TTM_UPDATETIPTEXT, 0, (LPARAM)&ti );
        delete[] ti.lpszText;

   
}

 

其中GetToolTipInfo可以这样实现:

 
nItems = ::SendMessage(hToolTip, TTM_GETTOOLCOUNT, 0, 0);

 
for( i = 0; i<nItems; i++ )
  {
     if( ::SendMessage(hToolTip, TTM_ENUMTOOLS, i,
(LPARAM)&ti) )
    {
        if( ti.uId == (long)hWnd)
        {
            return TRUE;
        }
    }
  }

  return FALSE;

转载于:https://www.cnblogs.com/caoshenghe/archive/2010/10/07/1844947.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值