一.首先创建基于对话框的MFC工程TipBtn,添加成员变量UINT m_nBtnID和CRect m_rcBtn,拖放按钮IDC_BUTTON_ADD到对话框中。本例程动态创建含有提示的按钮。
二. 为对话框添加ToolTip支持,在CTipBtnDlg的头文件中定义CtoolTipCtrl型控件变量
m_tooltip。
// TipBtnDlg.h
class CTipBtnDlg : public Cdialog
{
// ……
// Implementation
public:
UINT m_nBtnID = WM_USER + 101; // 按钮ID
CRect m_rcBtn = CRect(10, 40, 10 + 40, 40 + 30); // 按钮的大小和位置
protected:
CToolTipCtrl m_tooltip;
// ……
}
三.在CTipBtnDlg的OnInitDialog函数中创建ToolTipCtrl并激活。
(1)BOOL CToolTipCtrl::Create( CWnd* pParentWnd, DWORD dwStyle = 0 );
参数:
pParentWnd |
指定工具提示控件的父窗口,通常是一个CDialog。它不能是NULL。 |
dwStyle |
指定工具提示控件的风格,可以是任意Windows风格的组合。 若|TTS_ALWAYSTIP则不管工具栏所属窗口是否被激活,提示都会出现。 |
(2)void CToolTipCtrl::Activate( BOOL bActivate );
若bActivate=TRUE,即工具提示控件被激活,当光标路过一个向提示控件注册过的工具上时就会显示提示信息;
若bActivate=FALSE,即工具提示控件未被激活,则不会显示工具提示信息,即使是光标路过一个工具上。
// TipBtnDlg.cpp
BOOL CTipBtnDlg::OnInitDialog()
{
// ……
m_tooltip.Create(this); // 创建ToolTipCtrl
m_tooltip.SetTipBkColor(RGB(0, 255, 128)); // 设置提示文本背景颜色
m_tooltip.SetTipTextColor(RGB(255, 0, 0)); // 设置提示文本字体颜色
m_tooltip.Activate(TRUE); // 激活ToolTipCtrl
// ……
}
四.覆写TipBtnDlg的虚拟函数PreTranslateMessage
在工作区窗口中的ClassView中右击CtipBtnDlgàAdd Virtual Functionà
PreTranslateMessageàAdd and Edit。
在PreTranslateMessage中添加代码:m_tooltip.RelayEvent(pMsg);
void CToolTipCtrl::RelayEvent( LPMSG lpMsg );
在系统TranlateMessage之前对消息进行过滤,当pMsg为WM_MOUSEMOVE,ToolTipCtrl将判断光标落在哪个控件范围类,并显示相关提示文本串。
// TipBtnDlg.cpp
BOOL CTipBtnDlg::PreTranslateMessage(MSG* pMsg)
{
// Let the ToolTip process this message.
m_tooltip.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
}
五.将需要提示的控件绑定到ToolTipCtrl提示工具控件
BOOL CToolTipCtrl::AddTool( CWnd* pWnd, LPCTSTR lpszText = LPSTR_TEXTCALLBACK, LPCRECT lpRectTool = NULL, UINT nIDTool = 0 );
此成员函数用来向工具提示控件注册一个工具pWnd,这样当光标路过pWnd所指向的控件(继承自CWnd)时,保存在工具提示控件中的提示信息就会被显示。
可以多次调用CtoolTipCtrl::AddTool来建立ToolTipCtrl提示控件与多个控件关联起来。
按钮IDC_BUTTON_ADD的点击事件处理如下:
// TipBtnDlg.cpp
// 动态创建按钮
void CToolbarDlgDlg::OnAddButton()
{
// 分配按钮ID
UINT id = m_nBtnID++;
char buffer[10];
itoa(id, buffer, 10);
// 创建按钮,标题为ID号
CButton *pButton = new CButton();
pButton->Create(buffer, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
m_rcBtn,this,m_nBtnID);
// 建立按钮与提示控件的关联,提示文本为ID号
// 可调用UpdateTipText更改提示文本
m_tooltip.AddTool(pButton, buffer);
// m_rcBtn纵向偏移10(40-30)
m_rcBtn.OffsetRect(0,40);
// 获取客户区矩形区域
CRect rc; GetClientRect(&rc);
// 纵坐标超过客户区底端,则另起一列
if (m_rcBtn.bottom > rc.bottom)
{
m_rcBtn.top = 10;
m_rcBtn.bottom = 40;
m_rcBtn.OffsetRect(70,0);// 横向偏移30(70-40)
}
// 显示按钮
pButton->ShowWindow(SW_SHOW);
}
六.运行效果如下:
评论