悬停文字 悬浮提示 CtoolTipCtrl

使用CtoolTipCtrl

 

导读:本文适用于相对静止的控件,比如按钮,不适用于向树型控件这样的位置不固定的控件(因为树型控件经常被折叠和展开)

 悬浮提示有专门的控件CtoolTipCtrl

CtoolTipCtrl封装了一个工具提示的控件,可弹出一个单行的小窗口来显示一些描述信息,大多时候它是隐藏的,除非用户将光标移到要显示提示的工具上面,并且停留大概半秒的时间它才显示,当单击鼠标或者移走光标的时候这个提示窗口就会消失

 

例子:给对话框的按钮添加提示功能

这里假设按钮是对话框类的成员变量,悬停对象也是对话框的成员变量

你的类可能是这样:

class CSpeedCtrl : public CFrameCtrl
{
	CButtonEx					m_btnUp;				//向上按钮控件
	CButtonEx					m_btnDown;				//向下按钮控件
	CButtonEx					m_btnLeft;				//向左按钮控件
	CButtonEx					m_btnRight;				//向右按钮控件
// 函数定义
private:
	CToolTipCtrl                m_displayPrompt;//按钮的悬浮提示
private:
	void InitializeToolTips(void);
public:
	// 构造函数
	CSpeedCtrl(void);
	// 析构函数
	~CSpeedCtrl(void);
	DECLARE_MESSAGE_MAP()

	// 消息函数,这里创建各种按钮,并调用InitializeToolTips()来构造悬浮对象
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//这里相应悬浮提示的事件,当鼠标移动到控件上悬浮文字出现
	BOOL PreTranslateMessage(MSG* pMsg);

};

创建成员变量并初始化各个组件

int CSpeedCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameCtrl::OnCreate(lpCreateStruct) == -1)
		return -1;
	InitializeButtons();//创建你的按钮成员
	InitializeToolTips();//创建悬浮成员,并指定到哪个按钮上面悬浮
	return 0;
}
对悬浮按钮进行初始化,并绑定要显示悬浮提示的多个控件,下面的这个函数是自己添加的,为了封装对悬浮按钮的控制

void CSpeedCtrl::InitializeToolTips(void)
{
	EnableToolTips(TRUE);
	if (!m_displayPrompt.Create(this,TTS_ALWAYSTIP))
	{
		TRACE(_T("Unable to create ToolTip/n"));
		return ;
	}
	m_displayPrompt.SetMaxTipWidth(500);//若屏蔽这行提示信息的格式可能会出现问题,不能换行  
	//m_displayPrompt.SetDelayTime(1);//从显示到消失的毫秒数
	m_displayPrompt.Activate(TRUE);


	CWnd* pW = GetDlgItem(IDC_BTN_SPEEDCTRL_UP);//得到窗口指针
	m_displayPrompt.AddTool(pW,_T("速度切换"));
	pW = GetDlgItem(IDC_BTN_SPEEDCTRL_DOWN);//得到窗口指针
	m_displayPrompt.AddTool(pW,_T("速度切换"));

	pW = GetDlgItem(IDC_BTN_SPEEDCTRL_LEFT);//得到窗口指针
	m_displayPrompt.AddTool(pW,_T("减小速度"));
	pW = GetDlgItem(IDC_BTN_SPEEDCTRL_RIGHT);//得到窗口指针
	m_displayPrompt.AddTool(pW,_T("增加速度"));

}

添加相应事件:这个函数最后一句话添加了CFrameCtrl::PreTranslateMessage(pMsg);这句话不能少,或者说一般都是必要的。

原因在于当前的类可能也只是其他类的成员变量,外围的更大范围的消息也需要响应。根据我的推测,MFC在相应一个消息的时候,总是先响应最内层的对象的消息,也就是成员的消息优先相应,响应完之后再交给父窗口去相应

BOOL CSpeedCtrl::PreTranslateMessage(MSG* pMsg)
{
	按钮的悬浮提示
	if ( pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP || pMsg->message == WM_MOUSEMOVE)
	{
		m_displayPrompt.RelayEvent(pMsg);
	}

	return CFrameCtrl::PreTranslateMessage(pMsg);

}

备注:

风格

意义

TTS_ALWAYSTIP

指示当光标在一个工具上时显示工具提示,不管工具提示的属主窗口是否是处于活动状态。没有这个风格,则只有当工具的属主窗口是活动的时候才会显示工具提示控件,否则不显示

TTS_NOPREFIX

这个风格禁止系统将 & 字符从一个字符串中去掉。如果一个工具提示控件没有 TTS_NOPREFIX 风格,则系统自动去掉 & 字符,让应用程序用同一个字符串作为菜单项和工具提示控件中的文本


效果图:

 

若在树型控件中使用tool tip

参考:http://www.codeproject.com/treectrl/treetooltip.asp

本文参考:

http://blog.csdn.net/zhuqinglu/article/details/1894905

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值