【MFC】鼠标悬停提示 CToolTipCtrl

【MFC】CToolTipCtrl实现鼠标悬停提示Tip

前言

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

“其他方案”参考链接:其他方案.

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值