给按钮、静态文本 CListCtrl等添加功能提示(tollTip)功能

(1) 

在头文件中定义CToolTipCtrl对象m_ToolTip;

CToolTipCtrl m_ToolTip;

(2) 

m_ToolTip.Create(this);//创建对象

m_ToolTip.AddTool( GetDlgItem(IDC_BTN_PLAYSTOP), "连接" );    //lianjie按钮的提示
    m_ToolTip.AddTool( GetDlgItem(IDC_CHECK_VIEW), "本地预览" );  //按钮的提示
 m_ToolTip.AddTool( GetDlgItem(IDC_BTN_BMPCAPTURE), "BMP抓图" );  //按钮的提示
 m_ToolTip.AddTool( GetDlgItem(IDC_BTN_LOCALREC), "本地录像" );  //按钮的提示
 m_ToolTip.AddTool( GetDlgItem(IDC_BTN_TALK), "语音对讲" );  //按钮的提示
 m_ToolTip.AddTool( GetDlgItem(IDC_BTN_RESET), "重启设备" );  //按钮的提示
    m_ToolTip.AddTool( GetDlgItem(IDCANCEL), "退出系统" );  //按钮的提示
 m_ToolTip.AddTool( GetDlgItem(IDC_BTN_CLEAR), "清除消息" );  //按钮的提示,

 

m_ToolTip.SetDelayTime(200);

    m_ToolTip.SetTipTextColor( RGB(0,0,0 ));//设置提示字体颜色

    m_ToolTip.SetTipBkColor( RGB(255,255,255));//设置提示背景颜色

    m_ToolTip.Activate(TRUE);

 

(3)

添加虚函数PreTranslateMessage

BOOL CLAUMp4TestDlg::PreTranslateMessage(MSG* pMsg) 
{
 // TODO: Add your specialized code here and/or call the base class
 switch(pMsg->message)

 {
 case WM_MOUSEMOVE:

  m_ToolTip.RelayEvent(pMsg);

 }
 return CDialog::PreTranslateMessage(pMsg);
}

//

为CListCtrl单元格添加提示信息的类

一、思路:
1. 确定鼠标落在哪一个单元格上面
2. 获得该单元格的文字信息
3. 更新tooltip的信息。

 
二、实施
1. 添加CListCtrl的派生类CMyListCtrl

2.添加声明成员变量

[cpp]  view plain copy
  1. CToolTipCtrl m_toolTip;        //文本提示类  
  2. int m_nSubItem;                //存放行号  
  3. int m_nItem;                //存放列号  
  4. BOOL m_bEnableTips;            //是否开启文本提示  

3.初始化成员变量

[cpp]  view plain copy
  1. CMyListCtrl::CMyListCtrl()  
  2. {  
  3.     m_bEnableTips=TRUE;  
  4.     m_toolTip.Create(this);  
  5. }  

4. 为该派生类添加WM_MOUSEMOVE消息
5. 在WM_MOUSEMOVE的消息处理函数中添加如下代码:

[cpp]  view plain copy
  1. void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)   
  2. {  
  3.     // TODO: Add your message handler code here and/or call default  
  4.     //如果开启文本提示  
  5.     if(m_bEnableTips)  
  6.     {  
  7.         CString str;  
  8.         LVHITTESTINFO lvhti;  
  9.   
  10.         // 判断鼠标当前所在的位置(行, 列)  
  11.         lvhti.pt = point;      
  12.         SubItemHitTest(&lvhti);  
  13.       
  14.         //如果鼠标移动到另一个单元格内, 则进行处理; 否则, 不做处理  
  15.          if((lvhti.iItem != m_nItem) || (lvhti.iSubItem != m_nSubItem))  
  16.          {  
  17.              // 保存当前鼠标所在的(行,列)  
  18.             m_nItem = lvhti.iItem;  
  19.             m_nSubItem = lvhti.iSubItem;  
  20.   
  21.             // 如果鼠标移动到一个合法的单元格内,则显示新的提示信息  
  22.             // 否则, 不显示提示  
  23.             if((m_nItem != -1) && (m_nSubItem != -1))  
  24.             {  
  25.                  // @@@@@@@@ 在这里修改要显示的提示信息  
  26.                  // 这里仅仅是一个例子---获得当前单元格的文字信息, 并设置为新的提示信息  
  27.                  str = GetItemText(m_nItem ,m_nSubItem);     
  28.                  m_toolTip.AddTool(this, str);   
  29.                  // 显示提示框  
  30.                  m_toolTip.Pop();  
  31.              }  
  32.             else  
  33.             {  
  34.                 m_toolTip.AddTool(this"");  
  35.                 m_toolTip.Pop();  
  36.             }  
  37.          }  
  38.     }  
  39.   
  40.     CListCtrl::OnMouseMove(nFlags, point);  
  41. }  

6.添加虚函数 PreTranslateMessage

[cpp]  view plain copy
  1. BOOL CMyListCtrl::PreTranslateMessage(MSG* pMsg)   
  2. {  
  3.     if(m_toolTip.GetSafeHwnd())  
  4.      {  
  5.          m_toolTip.RelayEvent(pMsg);  
  6.      }    
  7.     return CListCtrl::PreTranslateMessage(pMsg);  
  8. }  

CToolTipCtrl 如何换行

Tooltip中由一个方法叫做SetMaxTipWidth,MSDN中的描述说是设定Tips窗口的最大宽度,然后就没了。
其实这个方法是使用SDK中的TTM_SETMAXTIPWIDTH 消息,查一下这个消息的描述,就会发现很多内容。
1. 这个方法是设定Tips窗口的最大宽度,in pixel;
2. 如果文字超过这个最大宽度,则control进行自动换行,以空格为换行标志;
3. 如果无法换行(没有空格或\r\n),则显示一行,宽度超过最大宽度。

还有很重要的一点,如果没有设定过宽度,则系统默认宽度为-1,这也是没有设定宽度就不能换行的原因。

试验结果:
1. 一旦设定宽度,\r\n和空格就会同时起作用,只是空格是在一行宽度超过设定宽度时起作用的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值