【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++从入门到精通(项目案例版)》
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
