使用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