MFC 对话框 添加 工具栏

Toolbar

MFC中如何删除工具栏中多余的图标

刚学习MFC的时候,发现在MFC资源视图里面编辑工具栏的时候,多余的图标没有删除键,其实只要把你要删除的图标按住并往外拖就可以了。


工具栏资源的最右边总是会有一个待编辑的按钮,我们对其进行编辑后,工具栏资源会自动增加一个新的空白按钮,这也实现了按钮的添加操作。如果我们想要删除某个按钮,就可以用鼠标左键点住它,拖出工具栏资源的范围即可。

   另外,我们看到,第三个按钮(保存按钮)和第四个按钮(剪切按钮)之间有一些间隙,在运行程序后会出现一个竖的分隔线,所以想要在两个按钮之间添加分隔线的话,可以用鼠标左键拖住右边的按钮往右稍移动一些就可以了。
删除分割线

可以用鼠标左键拖住右边的按钮往左移动到快覆盖左边的按钮的时候松开就可以了。

如果 按钮 之间 有分割线 ,分割线 也会占用一个index 序号, 就是 本来 0123456 现在是01234567

通过Toolbar 添加 ID

如果 事件处理函数 已经定义了,建立关联 需要手动添加关联
如果 事件处理函数 没有定义,建立关联 可以通过类向导


这个图中代码 有点问题.


VC 自动生成的ID 不一定正好是按照顺序的
看下面的例子

 atlTraceGeneral - m_Toolbar 0 -- 32811atlTraceGeneral - m_Toolbar 1 -- 32810atlTraceGeneral - m_Toolbar 2 -- 32812atlTraceGeneral - m_Toolbar 3 -- 32813atlTraceGeneral - m_Toolbar 4 -- 32814atlTraceGeneral - m_Toolbar 5 -- 32815atlTraceGeneral - m_Toolbar 6 -- 32816

Resource.h VC 自动生成的,每次重新编译 都会自动生成

广州大学MFC实验报告——学生成绩管理系统

https://blog.csdn.net/weixin_43999137/article/details/91184179

https://github.com/wujiekd/MFC-student-performance-management-system

VS2013/MFC编程入门之三十四(工具栏:工具栏资源及CToolBar类)

https://blog.csdn.net/zhaoyinhui0802/article/details/53471257

上一节中讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏。

   工具栏简介工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成。当用户用鼠标单击工具栏上某个按钮时,程序会执行相应的操作,如果鼠标没有点击,只是停留在某个按钮上一会后,会弹出一个小窗口显示提示信息。一般工具栏中的按钮在菜单栏中都有对应的菜单项中,即点击工具栏按钮与点击菜单项的效果相同。但工具栏中的按钮都显式的排列出来,操作很方便,而且按钮上的图片描述功能更直观,所以工具栏作为用户操作接口来说比菜单更加便捷。VS2013工具栏资源详解本节仍然以VS2013/MFC编程入门之三十二(菜单:VS2010菜单资源详解)中创建的单文档工程Example32为基础,讲解工具栏资源。在Example32工程中,打开资源视图,展开Example32->Example32.rc->Toolbar,我们可以看到有一个ID为IDR_MAINFRAME的工具栏资源,双击打开,工具栏资源显示如下:


以IDR_MAINFRAME工具栏的第一个按钮为例说明工具栏按钮的各项属性。用鼠标单击工具栏资源上的第一个按钮,属性页中就会显示其属性。下面分别讲解各项属性。

   ID属性:ID_FILE_NEW。将菜单Meun的时候我们讲过,菜单IDR_MAINFRAME的菜单项文件->新建的ID也是ID_FILE_NEW,两者ID相同,正是如此才使得工具栏第一个按钮与菜单项文件->新建能实现相同的功能。所以如果想让工具栏某个按钮与菜单栏某个菜单项点击后执行的操作相同,就要为两者设置相同的ID。Prompt属性:创建新文档\n新建。此属性为工具栏按钮的提示文本。在鼠标指向此按钮时,状态栏中会显示“创建新文档”,当弹出提示信息窗口时会显示包含“新建”的提示信息。“\n”是两者的分隔转义符。Height属性:15。此属性为工具栏按钮的像素高度。Width属性:16。此属性为工具栏按钮的像素宽度。工具栏资源的最右边总是会有一个待编辑的按钮,我们对其进行编辑后,工具栏资源会自动增加一个新的空白按钮,这也实现了按钮的添加操作。如果我们想要删除某个按钮,就可以用鼠标左键点住它,拖出工具栏资源的范围即可。另外,我们看到,第三个按钮(保存按钮)和第四个按钮(剪切按钮)之间有一些间隙,在运行程序后会出现一个竖的分隔线,所以想要在两个按钮之间添加分隔线的话,可以用鼠标左键拖住右边的按钮往右稍移动一些就可以了。CToolBar类的主要成员函数MFC为工具栏的操作提供了CToolBar类。下面介绍CToolBar类的主要成员函数。virtual BOOL CreateEx(CWnd* pParentWnd,DWORD dwCtrlStyle = TBSTYLE_FLAT,DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,CRect rcBorders = CRect(0, 0, 0, 0),UINT nID = AFX_IDW_TOOLBAR);创建工具栏对象。参数pParentWnd为工具栏父窗口的指针。参数dwCtrlStyle为工具栏按钮的风格,默认为TBSTYLE_FLAT,即“平面的”。参数dwStyle为工具栏的风格,默认取值WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,由于是主框架窗口的子窗口,所以要有WS_CHILD和WS_VISIBLE风格,CBRS_ALIGN_TOP风格表示工具栏位于父窗口的顶部, 各种风格可以参见MSDN的Toolbar Control and Button Styles中的定义。参数rcBorders为工具栏边框各个方向的宽度,默认为CRect(0, 0, 0, 0),即没有边框。参数nID为工具栏子窗口的ID,默认为AFX_IDW_TOOLBAR。BOOL LoadBitmap(UINT nIDResource);为工具栏加载位图。参数nIDResource为位图资源的ID。成功则返回TRUE,否则返回FALSE。注意,这里的位图资源应当为每个工具栏按钮都提供位图,如果图片不是标准大小(16像素宽,15像素高),则需要调用SetSizes成员函数调整按钮大小和图片大小。BOOL LoadToolBar(UINT nIDResource);加载由nIDResource指定的工具栏。参数nIDResource为要加载的工具栏的资源ID。成功则返回TRUE,否则返回FALSE。void SetSizes(SIZE sizeButton,SIZE sizeImage);设置工具栏按钮的大小和图片的大小。参数sizeButton为工具栏按钮的像素大小。参数sizeImage为图片的像素大小。void SetButtonStyle(int nIndex,UINT nStyle);设置工具栏按钮或分隔线的风格,或者为按钮分组。参数nIndex为将要进行设置的按钮或分隔线的索引。参数nStyle为按钮风格,可以是以下取值:TBBS_BUTTON   标准按钮(默认)TBBS_SEPARATOR   分隔条 TBBS_CHECKBOX   复选框 TBBS_GROUP   标记一组按钮的开始TBBS_CHECKGROUP   标记一组复选框的开始TBBS_DROPDOWN   创建下拉列表按钮TBBS_AUTOSIZE   按钮的宽度根据按钮文本计算,而不基于图片大小 TBBS_NOPREFIX   按钮的文本没有快捷键前缀UINT GetButtonStyle(int nIndex) const;获取工具栏按钮或分隔条的风格。风格可参考SetButtonStyle。参数nIndex为按钮或分隔条的索引。BOOL SetButtonText(int nIndex,LPCTSTR lpszText);设置工具栏按钮的文本。参数nIndex为工具栏按钮的索引。参数lpszText为指向要设置的文本字符串的指针。设置成功则返回TRUE,否则返回FALSE。CString GetButtonText(int nIndex) const;获取工具栏按钮上显示的文本。参数nIndex为工具栏按钮的索引。

工具栏的使用

   一般情况下工具栏中的按钮在菜单栏中都有对应的菜单项,两者实现的功能相同,要想实现这种效果,只需要将工具栏按钮的ID与对应的菜单栏中菜单项的ID设置为相同值即可。在实际使用工具栏时,除了前面讲的资源编辑外,其他使用与菜单类似。例如,对COMMAND消息和UPDATE_COMMAND_UI消息,可以像VS2013/MFC编程入门之三十三(菜单:菜单及CMenu类的使用)中的菜单应用实例那样为工具栏按钮添加消息处理函数。如果工具栏按钮对应的菜单项已经添加了消息处理函数,那么就不必再为它添加了,因为它的ID与菜单项相同,所以会调用同样的消息处理函数。这样点击工具栏按钮与点击相应菜单项执行相同的功能,在菜单项为选中、激活或禁用等状态时,工具栏按钮会有一样的状态。工具栏的创建大家在第三十二讲创建的Example32工程的CMainFrame类中看到,它创建工具栏所使用的类并不是常用的CToolBar类,而是CMFCToolBar类。CMFCToolBar类是自VS2008以来MFC提供的类,它与CToolBar类有些类似,但功能更丰富。这里要注意,CMFCToolBar类与CToolBar类并没有任何派生关系。本教程就以CMFCToolBar类来讲讲工具栏的创建步骤:1. 创建工具栏资源。2. 构造CMFCToolBar类的对象。3. 调用CMFCToolBar类的Create或CreateEx成员函数创建工具栏。4. 调用LoadToolBar成员函数加载工具栏资源。大家可以对应着看看Example32的CMainFrame类自动生成的代码中创建工具栏的过程。工具栏IDR_MAINFRAME的资源已经自动创建好。在MainFrm.h文件对CMainFrame类的声明中,定义了CMFCToolBar类的对象作为成员对象:CMFCToolBar  m_wndToolBar;。然后在CMainFrame::OnCreate函数的实现中可以看到工具栏的创建以及加载工具栏资源的代码,如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{   if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   return -1;   ......略   if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{TRACE0("未能创建工具栏\n");
return -1;      // 未能创建
}......略   return 0;
}  

因为创建框架窗口时需要调OnCreate函数,所以工具栏的创建也是在OnCreate中完成的。

   工具栏的停靠在创建好工具栏后,如果想要停靠工具栏,也需要添加相应的停靠代码。工具栏停靠的步骤及需要调用的函数如下(前两个步骤可以颠倒顺序):1. 在框架窗口中启用停靠。若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。可以在CFrameWndEx类中调用下面的成员函数来实现:BOOL EnableDocking(DWORD dwDockStyle);该函数采用一个DWORD参数,用来指定框架窗口的哪个边可以接受停靠,可以有四种取值:CBRS_ALIGN_TOP(顶部)、CBRS_ALIGN_BOTTOM(底部)、CBRS_ALIGN_LEFT(左侧)、CBRS_ALIGN_RIGHT(右侧)。如果希望能够将控制条停靠在任意位置,将CBRS_ALIGN_ANY作为参数传递给EnableDocking。2. 工具栏启用停靠。框架窗口启用停靠准备好后,必须以相似的方式准备工具栏。为想要停靠的每一个工具栏CMFCToolBar对象调用下面的函数:virtual void EnableDocking(DWORD dwAlignment);允许工具栏停靠到框架窗口,并指定工具栏应停靠的目标边。此函数指定的目标边必须与框架窗口中启用停靠的边匹配,否则工具栏无法停靠,为浮动状态。3. 停靠工具栏。当用户试图将工具栏放置在允许停靠的框架窗口某一边时,需要框架CFrameWndEx类调用以下函数:void DockPane(CBasePane* pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL);参数pBar为要停靠的控制条的指针,参数nDockBarID为要停靠的框架窗口某条边的ID,可以是以下四种取值:AFX_IDW_DOCKBAR_TOP、AFX_IDW_DOCKBAR_BOTTOM、AFX_IDW_DOCKBAR_LEFT、AFX_IDW_DOCKBAR_RIGHT。下面我们接着看Example32的CMainFrame类的OnCreate函数实现中,工具栏的停靠过程:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{   if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   return -1;   ......略   // 调用CreateEx函数创建工具栏,并调用LoadToolBar函数加载工具栏资源  if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||   !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))   {   TRACE0("Failed to create toolbar\n");   return -1;      // fail to create   }     ......略
// TODO:  如果您不希望工具栏和菜单栏可停靠,请删除这五行
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndMenuBar);
DockPane(&m_wndToolBar);......略     return 0;
}  

关于工具栏的知识就讲到这里了,最近由于要准备期末考试,每天更新的内容比较少,希望大家谅解,谢谢。。感谢大家长期以来的支持。

工具栏 例子 代码 vs2017

https://download.csdn.net/download/wowocpp/33353202

MFC 对话框 添加 工具栏相关推荐

  1. c语言mfc怎么插入背景图片,MFC 对话框添加背景图片详细过程(两种方法)

    给对话框添加背景图片方法很多,在此贴出两种很常见的方法.一种是通过读取位图资源显示位图(BitMap) step: 1.创建内存设备上下文: 2.选择位图,将其装入内存设备上下文: 3.使用BitBl ...

  2. MFC 对话框添加背景图

    // 给对话框添加背景图 BOOL CEditCtrlMultilineDlg::OnEraseBkgnd(CDC* pDC) {// TODO: 在此添加消息处理程序代码和/或调用默认值CDC Me ...

  3. MFC 对话框添加背景图片详细过程(两种方法)

    给对话框添加背景图片方法很多,在此贴出两种很常见的方法.一种是通过读取位图资源显示位图(BitMap) step: 1.创建内存设备上下文: 2.选择位图,将其装入内存设备上下文: 3.使用BitBl ...

  4. 如何给MFC对话框添加背景图片

    一.创建项目 文件-新建项目-MFC应用程序-该页面使用"基于对话框"-完成即可. 注意:取消"使用Unicode库",否则在使用AfxMessageBox会报 ...

  5. MFC对话框添加菜单栏

    1.解决方案资源管理器--资源文件--**.rc双击(转至资源视图) 2.资源视图--右击**.rc--添加资源--Menu--新建--图形化界面编辑 3.图形化编辑完成后,切换到目标对话框的头文件( ...

  6. MFC几种给对话框添加背景图的方法

    1,目标 总结几种给MFC对话框添加背景图片的方法. 2,实现 方式一:(适用于多种格式)用CImage类可以加载多种格式的图片,在OnPaint中Draw即可. void CBackgroundDl ...

  7. 在VS2013环境下MFC学习:给对话框添加背景图片

    步骤1 添加资源 先右击工程名.rc(我的是PlaneDiag_Demo_MFC),再点击"添加资源" 步骤2 导入BMP图像 进入"添加资源"界面后,点击资源 ...

  8. MFC对话框中添加工具栏

    1. 在资源管理器中添加 ToolBar资源,资源 ID为 IDR_TOOLBAR1 加入两个工具栏按钮 2. 在对话框头文件 XxxDlg.h中添加工具栏变量 CToolBar m_toolBar; ...

  9. MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息

    对话框中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息 在对话框程序中添加工具栏其实很简单,网上能找到很多的例子.一般的步骤就是:1.在资源中添加工 具栏资源:2.在对话 ...

  10. MFC对话框中的工具栏、状态栏设计小结

    对网上的资料结合自己的实践的总结,由于大部分都是网上先辈们的经验,这里只是直接将内容拿来,格式优化一下更易读而已. 对话框中建立工具栏的方法 工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标 ...

最新文章

  1. 遗传算法解决01背包
  2. R语言Hosmer-Lemeshow检验得到校准曲线的P值实战
  3. r语言和python-R语言和Python哪个适合生物信息学?
  4. 20170204-py
  5. How to Simulate the Price Order or Price Line Function using API QP_PREQ_PUB.PRICE_REQUEST Includes
  6. 人工智障学习笔记——机器学习(12)LDA降维
  7. LINQ解决依据某个字段去重
  8. 201521123079《java程序设计》第8周学习总结
  9. 介绍几款WAP网页制作工具
  10. A星算法优化(二)权重系数
  11. C语言实现一个关机程序
  12. plc编程语言是c语言吗,PLC各种编程语言特点你了解多少?
  13. gmap实现地图的旋转
  14. 图像超分之——寻找两张图差异的区域
  15. mysql 日期截止,MySQL查询以开始日期和结束日期计算日期范围内的天数
  16. stormzhang的自我介绍
  17. RTX2070s和RTX2060s显卡差距大吗?
  18. 《统计学》——思考题第二章数据的搜集(贾俊平)
  19. 我的Android开发半年工作经验总结
  20. html 重置画布坐标系,H5中canvas的坐标系(画布初始)

热门文章

  1. 搭建离线版keras中文文档
  2. html转pdf分页问题终极解决方案 k-htmlpdf
  3. 嵌入式软件测试怎么实现自动化测试?
  4. Android四大组件之间的交互,Android四大组件每个组件的作用?它们都可以开启多进程吗?...
  5. matlab指数分布拟合,如何使用matlab拟合指数分布函数?
  6. OneForAll安装使用
  7. cpc安装 mysql_专利电子申请客户端(CPC软件)
  8. (综述,讲得很好)基于3DMM的三维人脸重建技术总结
  9. 鸟哥的Linux私房菜-服务器架设篇
  10. CSS面试题汇总(四)