【MFC】具有提示功能的工具栏

00. 目录

文章目录

    • 00. 目录
    • 01. 案例概述
    • 02. 开发环境
    • 03. 关键技术
    • 04. 程序设计
    • 05. 秘笈心法
    • 06. 源码下载
    • 07. 附录

01. 案例概述

在文档\视图结构的应用程序中,默认情况下,当鼠标在工具栏按钮上停留片刻,会出现一个工具提示条。那么在基于对话框的应用程序中能够实现该功能吗?运行本案例,将鼠标移至工具栏上的某一按钮上,即可看到该工具按钮的提示信息,效果如下图所示。
在这里插入图片描述

02. 开发环境

系统环境:Windows 10

开发环境:Visual Studio 2019

03. 关键技术

使工具栏具有提示功能,需要同时具备几个条件。一是工具栏具有CBRS_TOOLTIPS风格,二是工具栏的父窗口需要处理TTN_NEEDTEXT通知消息。在MFC类库中,CFrameWnd默认处理了TTN_NEEDTEXT通知消息,因此,在文档\视图结构的应用程序中,只要工具栏具有CBRS_TOOLTIPS风格,就能够显示提示信息。

如果在对话框中添加TTN_NEEDTEXT通知消息,需要在消息映射部分添加如下代码:

ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify)

其中,OnToolTipNotify是处理TTN_NEEDTEXT消息的函数,函数原型如下:

OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)

参数说明:

参数id是发送消息的控件ID,但此处没有用,因为控件ID可以来自于pNMHDR。

参数pNMHDR是一个NMHDR(实际应该是NMTTDISPINFO结构指针)结构指针,NMHDR结构记录了发送消息的控件ID、句柄等信息。

参数pResult表示结果代码指针,TTN_NEEDTEXT消息可以忽略该参数。

04. 程序设计

(1)新建一个基于对话框的工程。

(2)在对话框类中定义一个CToolBar变量m_ToolBar。在工作区的资源视图中创建一个工具栏资源。

(3)在对话框的OnInitDialog方法中创建工具栏。

(4)在对话框的消息映射部分添加TTN_NEEDTEXT消息映射宏。

(5)向对话框中添加OnToolTipNotify方法,代码如下:

头文件

// CMy4ToolDlg 对话框
class CMy4ToolDlg : public CDialogEx
{
// 构造
public:CMy4ToolDlg(CWnd* pParent = nullptr);	// 标准构造函数CToolBar m_ToolBar;CString m_Str;// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_MY4TOOL_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult);DECLARE_MESSAGE_MAP()
};

源文件

BEGIN_MESSAGE_MAP(CMy4ToolDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipNotify)
END_MESSAGE_MAP()BOOL CMy4ToolDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标// TODO: 在此添加额外的初始化代码UINT array[10];for (int i = 0; i < 10; i++){if (i == 3 || i == 7)array[i] = ID_SEPARATOR; //第4、8个按钮为分隔条elsearray[i] = i + 1001;}m_ToolBar.Create(this);m_ToolBar.SetButtons(array, 10);m_ToolBar.SetButtonText(0, TEXT("新建"));m_ToolBar.SetButtonText(1, TEXT("打开"));m_ToolBar.SetButtonText(2, TEXT("保存"));m_ToolBar.SetButtonText(4, TEXT("剪切"));m_ToolBar.SetButtonText(5, TEXT("复制"));m_ToolBar.SetButtonText(6, TEXT("粘贴"));m_ToolBar.SetButtonText(8, TEXT("打印"));m_ToolBar.SetButtonText(9, TEXT("帮助"));m_ToolBar.LoadBitmap(IDB_BITMAP1);			   //加载位图m_ToolBar.SetSizes(CSize(36, 36), CSize(16, 16)); //设置按钮和按钮位图大小m_ToolBar.EnableToolTips(TRUE);RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示工具栏return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}BOOL CMy4ToolDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
{TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR;//获取工具栏按钮IDUINT nId = pNMHDR->idFrom;//根据ID获取按钮索引int index = m_ToolBar.GetToolBarCtrl().CommandToIndex(nId);//根据索引获取按钮文本m_ToolBar.GetButtonText(index, m_Str);//设置显示的提示信息pTTT->lpszText = m_Str.GetBuffer(0);pTTT->hinst = AfxGetResourceHandle();return TRUE;}

05. 秘笈心法

信息提示的实现

信息提示的方法有很多,实例中使用的是处理TTN_NEEDTEXT消息的方法,同样还可以使用ctooltip控件的方法来实现提示效果。

06. 源码下载

下载:【MFC】具有提示功能的工具栏.rar

07. 附录

参考: 《Visual C++从入门到精通(项目案例版)》


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部