前言
ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl。可以通过该类实现鼠标悬停后的提示tip。
代码实现
先声明CToolTipCtrl类的变量
CToolTipCtrl m_TipMsg;
初始化:
m_TipMsg.m_hWnd = NULL;
//船舶提示框初始化
void TipInit()
{
if (m_TipMsg.m_hWnd == NULL)
{
m_TipMsg.Create(this);
m_TipMsg.Activate(true);
m_TipMsg.AddTool(this,TTS_ALWAYSTIP);//TTS_ALWAYSTIP
m_TipMsg.SetMaxTipWidth(500);//设定显示宽度,超长内容自动换行
m_TipMsg.SetTipBkColor(APP_MAIN_TXT_COLOR);//(RGB(210,210,255));
m_TipMsg.SetTipTextColor(APP_MAIN_BK_NIGHT_COLOR);//(RGB(0,106,53));
m_TipMsg.SetDelayTime(TTDT_INITIAL,10); //鼠标指向多久后显示提示,毫秒
m_TipMsg.SetDelayTime(TTDT_AUTOPOP, 3000); //鼠标保持指向,提示显示多久,毫秒
//m_TipMsg.SetDelayTime(TTDT_RESHOW, 1000);;//鼠标从当前控件移动到另一个控件后,需要等待1秒后弹出提示;
}
}
提示框文本的加载:
在一般的应用中,可以通过捕获主窗口的WM_MOUSEMOVE消息,在OnMouseMove(UINT nFlags, CPoint point)函数中根据鼠标点所在位置是否位于指定悬停区域内,是的话就显示提示tip。
代码片:
void CDialog::OnMouseMove(UINT nFlags, CPoint point)
{
CButton::OnMouseMove(nFlags, point);
CRect rect;
CRgn rng;
//假设要在IDC_BUTTON控件上显示提示
GetDlgItem(IDC_BUTTON)-> GetwindowRect(&rect);
rgn.CreateRectRgn(rect.top, rect.left, rect.bottom, rect.right);
if (PtInRegion(rng,point.x,point.y))
{
strTip.Format(_T("提示文本"),m_pMeasureDis->m_dbNautical_Mile);
m_TipMsg.UpdateTipText(m_strTipNull,this);
}
}
重载函数PreTranslateMessage(MSG pMsg)*
BOOL CChildView::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
TipInit();
if(m_TipVirtualSignMsg.m_hWnd!=NULL)
{
m_TipMsg.RelayEvent(pMsg);
}
return CWnd::PreTranslateMessage(pMsg);
}
其他方案
利用CWnd本身自身支持的ToolTip来实现,这种方法适用给控件增加ToolTip,非常方便和简单方法如下:
1、在窗口中增加消息映射ON_NOTIFY_EX(TTN_NEEDTEXT, 0, SetTipText)
SetTipText是个回调函数,函数名任意,只需要符合原型就行。 原型为 BOOL SetTipText(UINT id, NMHDR *pTTTStruct, LRESULT *pResult),
2、EnableToolTips(TRUE),使用这个方法调用这个函数是必不可少的.建议在CDialog::OnInitDialog调用。
3、在窗口中增加一个函数用于动态提供显示内容,即刚才创建的回调函数SetTipText。
BOOL CWndYour::SetTipText(UINT id, NMHDR *pTTTStruct, LRESULT *pResult)
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;
UINT nID = pTTTStruct->idFrom; //得到相应窗口ID,有可能是HWND
//表明nID是否为HWND
if (pTTT->uFlags & TTF_IDISHWND)
{
//从HWND得到ID值,当然你也可以通过HWND值来判断
nID = ::GetDlgCtrlID((HWND)nID);
if (NULL == nID)
return FALSE;
switch(nID)
{
case(IDC_YOUR_CONTROL1)
strcpy(pTTT->lpszText, your_string1);
break;
case(IDC_YOUR_CONTROL2)
//设置相应的显示字串
break;
default:
break;
}
return TRUE;
}
return FALSE;
}
4、很重要的一点,要显示的控件必须设置notify属性,否则收不到notify消息,自然也就显示不了tooltip。
“其他方案”参考链接:其他方案.