CToolTipCtrl是用来显示单行文本的弹出框,可以给继承自CFrameWnd(提供了一个缺省的TTN_NEEDTEXT消息处理函数)的Windows控件添加一些提示信息。要使用它,包含3个步骤:
- Enabling Tool Tips
- Handling TTN_NEEDTEXT Notification for Tool Tips
- The TOOLTIPTEXT Structure
也就是说,第一步需要先打开这个功能(Tool Tips)。第二步需要处理TTN_NEEDTEXT消息,并不是必须的。第三步是利用TOOLTIPTEXT结构体提供的信息,设置提示内容。打开工具提示消息功能,使用函数EnableToolTips。其原型是:
bEnable为TRUE时打开功能,为FALSE时关闭工具提示功能。
处理TTN_NEEDTEXT需要一个消息映射ON_NOTIFY_EX( TTN_NEEDTEXT, 0, memberFxn )。其中的的memberFxn 是消息处理函数。memberFxn 的原型为:
NMHDR是一个结构体,包含了对应控件的句柄、ID和消息代码。此参数可以由NMHDR为其一个成员的结构体替换使用,比如后面提到两种结构体NMTTDISPINFO、TOOLTIPTEXT。
消息处理函数的参数是NMHDR类型的指针,它实际上指向的是一个 NMTTDISPINFO结构体。
使用时常使用TOOLTIPTEXT结构体。
可以看出其基本结构是一致的。前者只是后者的一个替代而已。各个成员代码已经做了解释,不再解释。
我们看看MSDN提供的示例:
TOOLTIPTEXT的uFlags成员就是用来指示NMHDR的idForm的解释方式。如果指示它是一个窗口句柄,它就指示了鼠标当前停靠的控件,显示lpszText或者szText的提示信息。
成功了吗?还差一点,需要将鼠标产生的消息传递给Tool Tip。这就需要使用CToolTipCtrl提供的一个成员函数RelayEvent。
现在开始自己动手吧。
1、创建一个CToolTipCtrl成员。
2、添加消息映射。在消息映射宏BEGIN_MESSAGE_MAP(CRDlg, CDialog)和END_MESSAGE_MAP()之间添加如下内容。
3、声明消息处理函数
4、打开工具消息提示功能。调用CToolTipCtrl的BOOL Create( CWnd* pParentWnd, DWORD dwStyle = 0 )函数创建一个CToolTipCtrl。添加在OnInitDialog()函数中。
5、注册一个工具。如果只是给一个控件添加提示消息,可以直接将LPSTR_TEXTCALLBACK改为提示消息,不需要消息映射及消息处理函数,但只能给一个控件添加。
6、实现消息处理函数。
7、在PreTranslateMessage中传递消息。
OK。大功告成。