(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);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
一、思路:
1. 确定鼠标落在哪一个单元格上面
2. 获得该单元格的文字信息
3. 更新tooltip的信息。
二、实施:
1. 添加CListCtrl的派生类CMyListCtrl
2.添加声明成员变量
CToolTipCtrl m_toolTip; //文本提示类 int m_nSubItem; //存放行号 int m_nItem; //存放列号 BOOL m_bEnableTips; //是否开启文本提示
3.初始化成员变量
CMyListCtrl::CMyListCtrl() { m_bEnableTips=TRUE; m_toolTip.Create(this); }
4. 为该派生类添加WM_MOUSEMOVE消息
5. 在WM_MOUSEMOVE的消息处理函数中添加如下代码:
void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default //如果开启文本提示 if(m_bEnableTips) { CString str; LVHITTESTINFO lvhti; // 判断鼠标当前所在的位置(行, 列) lvhti.pt = point; SubItemHitTest(&lvhti); //如果鼠标移动到另一个单元格内, 则进行处理; 否则, 不做处理 if((lvhti.iItem != m_nItem) || (lvhti.iSubItem != m_nSubItem)) { // 保存当前鼠标所在的(行,列) m_nItem = lvhti.iItem; m_nSubItem = lvhti.iSubItem; // 如果鼠标移动到一个合法的单元格内,则显示新的提示信息 // 否则, 不显示提示 if((m_nItem != -1) && (m_nSubItem != -1)) { // @@@@@@@@ 在这里修改要显示的提示信息 // 这里仅仅是一个例子---获得当前单元格的文字信息, 并设置为新的提示信息 str = GetItemText(m_nItem ,m_nSubItem); m_toolTip.AddTool(this, str); // 显示提示框 m_toolTip.Pop(); } else { m_toolTip.AddTool(this, ""); m_toolTip.Pop(); } } } CListCtrl::OnMouseMove(nFlags, point); }
6.添加虚函数 PreTranslateMessage
BOOL CMyListCtrl::PreTranslateMessage(MSG* pMsg) { if(m_toolTip.GetSafeHwnd()) { m_toolTip.RelayEvent(pMsg); } return CListCtrl::PreTranslateMessage(pMsg); }
Tooltip中由一个方法叫做SetMaxTipWidth,MSDN中的描述说是设定Tips窗口的最大宽度,然后就没了。
其实这个方法是使用SDK中的TTM_SETMAXTIPWIDTH 消息,查一下这个消息的描述,就会发现很多内容。
1. 这个方法是设定Tips窗口的最大宽度,in pixel;
2. 如果文字超过这个最大宽度,则control进行自动换行,以空格为换行标志;
3. 如果无法换行(没有空格或\r\n),则显示一行,宽度超过最大宽度。
还有很重要的一点,如果没有设定过宽度,则系统默认宽度为-1,这也是没有设定宽度就不能换行的原因。
试验结果:
1. 一旦设定宽度,\r\n和空格就会同时起作用,只是空格是在一行宽度超过设定宽度时起作用的。