前言
在处理文档视图中,有时候需要根据鼠标指定的位置显示相应的提示信息,对于软件功能优化设计,此功能很有必要.
一、 一般处理方法
ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法。
一般用法步骤:
1.添加CToolTipCtrl成员变量 m_ToolTip。
2.在父窗口中调用EnableToolTips(TRUE);
3.在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串
BOOL bRet = m_ToolTip.Create(this);
m_ToolTip.Activate(TRUE);
m_ToolTip.SetDelayTime(TTDT_INITIAL,4000); //延迟4S后显示
m_ToolTip.SetDelayTime(TTDT_AUTOPOP,5000); //显示持续时间5S时间
m_ToolTip.Update();
m_ToolTip.AddTool(this, "test", CRect(30,30,800,800), IDC_TOOLTIP);
4.重载父窗口的 BOOL PreTranslateMessage(MSG* pMsg) ,在函数中调用 m_ToolTip.RelayEvent(pMsg)
5. 处理过程中需要显示更新字符的地方添加
m_ToolTip.UpdateTipText(m_str, this, IDC_TOOLTIP); //以view类中处理为例子,this表示当前窗口,IDC_TOOLTIP定义的ID
m_ToolTip.Update();
二 、 新问题以及解决办法
以上是一般处理方法,对于对话框中edit等控件提示可以如此操作,但对于view中某个指定区域内显示tip,当离开后隐藏,需要重新处理。
(1) 在处理处理去根据需要来自己处理tip显示与隐藏,例如:
if (rtPt.PtInRect(point))
{
m_ToolTip.UpdateTipText(strParam, this, IDC_TOOLTIP);
m_ToolTip.Update();
}
else
{
m_ToolTip.ShowWindow(SW_HIDE); //当离开指定区域隐藏 tip
}
(2) 处理延迟显示的功能
以上方法还无法处理tip延迟显示的功能,以下处理tip延迟显示功能
if (rtPt.PtInRect(point))
{
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE|TME_HOVER;
tme.dwHoverTime = 1000; //设置延迟显示的时间1S
//在指定的时间内鼠标处在窗口区域上,则发送消息MOUSELEAVE|MOUSEHOVER
if (::_TrackMouseEvent(&tme))
m_bTracking = true;
}
}
else
{
m_ToolTip.ShowWindow(SW_HIDE);
}
//在上次调用TrackMouseEvent指定的时间里,鼠标盘旋在窗口的客户区
void CMyView::OnMouseHover(UINT nFlags, CPoint point)
{
m_bTracking = FALSE;
m_ToolTip.UpdateTipText(m_strPinParamByLD, this, IDC_TOOLTIP);
m_ToolTip.Update();
}
//鼠标离开上次调用TrackMouseEvent时指定的窗口客户区
void CMyView::OnMouseLeave(UINT nFlags, CPoint point)
{
m_bTracking = FALSE; //当鼠标处在tip位置上处理此项,保证下次继续出发hover事件
}
//添加消息映射
ON_MESSAGE( WM_MOUSEHOVER, OnMouseHover )
ON_MESSAGE( WM_MOUSELEAVE, OnMouseLeave )
//.h 头文件中添加消息函数声明
afx_msg void OnMouseHover(UINT nFlags, CPoint point);
afx_msg void OnMouseLeave(UINT nFlags, CPoint point);
前前后后差不多花了一个多礼拜,终于把这个问题完美解决了,效率不很高,也走了不少弯路;主要是因为我一直想添加延迟函数来延迟显示tip,实验证明此方法效果不佳。问题解决的根本在于如何在指定时间内控制鼠标在目标区域的显示与隐藏,方法就是_TrackMouseEvent函数使用。
总结,编写windows程序,尤其做MFC,应该对windows相关API,各种消息机制,更加深入地了解,才能灵活地处理问题,基本上能想到的功能微软都会提供相应的接口。