正文

按钮添加ToolTip2009-08-19 21:25:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/46896.html

分享到:

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

阅读(6741) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册