一.首先创建基于对话框的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); } 六.运行效果如下:

评论