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++从入门到精通(项目案例版)》

【MFC】具有提示功能的工具栏相关推荐

  1. VC 创建具有提示功能的工具栏

    类CToolBar的对象是带有一行位图按钮和可选分隔线的控件条.这些按钮可以像普通按钮.核选按钮或单选按钮那样动作. Visual C++提供了两种创建一个工具条的方法.要使用资源编辑器(Resour ...

  2. MFC智能提示功能(通过CEdit和CListBox组合实现)

       效果图如上. 本功能只需要Edit编辑框和Listbox这两个控件组合使用即可实现. 首先为CEdit控件添加ON_EN_CHANGE消息响应函数,编辑框里的内容变化的时候会触发该函数,List ...

  3. 带图标工具栏的创建以及提示功能的添加

    一.带图标工具栏的创建: 第一步:将bmp位图或是ICON图标资源加入到资源视图中:我这里是bmp资源,添加资源时要按照你想要的顺序添加 第二步,在响应的头文件中定义CToolBar对象和CImage ...

  4. 使用MyEclipse的注解提示功能以及快捷键总结

    在MyEclipse中使用@注解提示功能的设置: 1. 打开MyEclipse,然后"window"→"Preferences" 2. 选择"java ...

  5. 【MFC】带图标的工具栏

    00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 默认情况下,MFC中提 ...

  6. VS+VAX的提示功能快速编写C51程序

    虽然有智能提示的软件有很多,比如Source Insight.Ultra Edit,但我都不太喜欢.周立功的TKStudio也用过,感觉还行,但还是不太满意. 由于学C#,我的电脑上安装了Visual ...

  7. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

  8. 百度搜索_如何打开Intellij IDEA的代码提示功能?

    Intellij IDEA是一款优秀的编程软件,相比较Eclipse之下它的用户群较小,但并不代表它的功能就比Eclipse差,如果用顺手了还是特别好用的.代码提示功能对于程序员来说非常重要,那么我们 ...

  9. MyEclipse扩展功能设置(Eclipse代码提示功能)

    如果是eclipse的 .提示功能没有了,照下边这样设置 window->Preferences->Java->Editor->ContentAssist->Advanc ...

最新文章

  1. SD-WAN — 技术架构
  2. List Set Map的区别
  3. linux 的 usr 文件
  4. Nemuria UML架构图 第2次迭代. 添加了缓冲层
  5. resnet系列+mobilenet v2+pytorch代码实现
  6. 西电计算机达标测试挂科保研,西电竞赛保研
  7. 微赞dataconfig.php,PHP标准化之路(一):使用 EditorConfig 实现语法统一
  8. 微软官方首度回应黑屏恐慌:不强制 不诉讼
  9. System.out和System.err的区别
  10. 跨域cookie设置
  11. 从数据库、代码和服务器对PHP网站Mysql做性能优化
  12. 数字逻辑课程设计--电子闹钟
  13. java 类似 ror的框架_php的ror类似框架, 有精美的视频展示
  14. 网络计算机自动显示,怎么设置电脑断网后自动报警提醒?
  15. DVWA靶机安装(超详细教程)
  16. Arduino基础应用学习
  17. 苹果拼图软件测试,装机必备软件评测:DSM记事本iPhone版
  18. js跟php增加删除信息,JavaScript动态增加节点和删除节点
  19. Day17——整数矩阵及其运算
  20. 【更新ing】已有5个省份公布2020软考报名时间

热门文章

  1. 【Unity3D技巧】一个简单的Unity-UI框架的实现
  2. html-----020----事件
  3. Tomcat源码解读系列(二)——Tomcat的核心组成和启动过程
  4. .NET异步方法调用的例子
  5. scrapy 解析css,Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段...
  6. Java黑皮书课后题第10章:*10.18(大素数)编写程序找出五个大于Long.Max_VALUE的素数
  7. Java黑皮书课后题第5章:*5.31(金融应用:计算CD价值)假设你用10 000美元投资一张CD,年利率为5.75%。编写程序,提示由用户输入一个金额数、年获利率、月份数,然后显示一个表格
  8. 【数据结构】之算法效率的度量
  9. html下拉框换行,HTML列表框换行文本
  10. git命令详解( 八)