本文通过实例说明MFC工具栏的创建、设计和使用方法,包括三个demo。

      demo1:创建一个工具栏

C++代码
  1. //摘抄自MSDN
  2. demo1 (创建一个工具栏)
  3. 1.Create a toolbar resource.
  4. /*可以先插入一个新的工具栏资源
  5. 添加分隔符,将按钮向右拖动一小下
  6. 删除按钮,将按钮拖动出工具栏
  7. */
  8. 2.Construct the CToolBar object.
  9. /*
  10. 工具栏是 CToolBar 对象,声明为应用程序的 CMainFrame 类的数据成员。也就是说,工具栏对象嵌入到主框架窗口对象中。这意味着 MFC 在创建框架窗口时创建工具栏,在销毁框架窗口时销毁工具栏。
  11. */
  12. 3.Call the Create (or CreateEx) function to create
  13. the Windows toolbar and attach it to the CToolBar object.
  14. 4.Call LoadToolBar to load the toolbar resource.
  15. /*
  16. 工具栏创建发生在 CMainFrame::OnCreate 中。MFC 在创建框架窗口之后且在窗口可见之前调用 OnCreate。
  17. 在 OnCreate 中调用适当的函数来停靠或浮动工具栏、设置它的样式等。
  18. 应用程序向导”生成的默认 OnCreate 执行以下工具栏任务:
  19. 1.调用 CToolBar 对象的 Create 成员函数来创建基础 CToolBarCtrl 对象。
  20. 2.调用 LoadToolBar 来加载工具栏资源信息。
  21. 3.调用函数来启用停靠、浮动和工具提示。
  22. */
  23. class CMainFrame : public CMDIFrameWnd
  24. {
  25. // ...
  26. // Implementation
  27. // ...
  28. protected:  // control bar embedded members
  29. CStatusBar  m_wndStatusBar;
  30. CToolBar    m_wndToolBar;
  31. // Generated message map functions
  32. protected:
  33. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  34. DECLARE_MESSAGE_MAP()
  35. };
  36. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  37. {
  38. if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
  39. return -1;
  40. //框架类中m_wndMyToolBar成员变量先调用CreateEx函数,再调用LoadToolBar函数
  41. if (! m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  42. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  43. ! m_wndToolBar.LoadToolBar(IDR_MYTOOLBAR))
  44. {
  45. TRACE0("Failed to create toolbar\n");
  46. return -1;      // fail to create
  47. }
  48. //调用CToolBar中的成员函数设置工具栏可停靠的位置
  49. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  50. //调用框架类中的成员函数设置哪里可以被停靠
  51. EnableDocking(CBRS_ALIGN_ANY);
  52. //Points to the control bar to be docked.
  53. DockControlBar(&m_wndToolBar);
  54. return 0;
  55. }

      demo2:停靠和浮动工具栏

C++代码
  1. demo2 (停靠和浮动工具栏)
  2. /*
  3. 如果使用“应用程序向导”来生成应用程序的主干,向导将要求您选择是否想要可停靠的工具栏。
  4. 默认情况下,“应用程序向导”生成代码来执行将可停靠工具栏放置在应用程序中所需的三个操作:
  5. 1.在框架窗口中启用停靠。
  6. 2.为工具栏启用停靠。
  7. 3.停靠工具栏(靠向框架窗口)。
  8. 如果这些步骤中的任何一个缺少,应用程序都将显示标准工具栏。
  9. 后两个步骤对应用程序中的每一个可停靠工具栏都必须执行。
  10. */
  11. CFrameWnd::EnableDocking()//在框架窗口中启用停靠
  12. /*
  13. 若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。
  14. 这可通过使用 CFrameWnd::EnableDocking 函数来实现,该函数采用一个 DWORD 参数,这是一组指示框架窗口的哪一个边接受停靠的样式位。
  15. 如果一个工具栏即将停靠并且有多个边可以停靠,则在传递给 EnableDocking 的参数中指示的边按以下顺序使用:顶边、底边、左边、右边。
  16. 如果希望能够将控制条停靠在任意位置,请将 CBRS_ALIGN_ANY 传递给 EnableDocking。
  17. */
  18. CControlBar::EnableDocking()//为工具栏启用停靠
  19. /*
  20. 准备好停靠目标后,必须以相似的方式准备工具栏(或源)。为想要停靠的每一个工具栏调用 CControlBar::EnableDocking,指定工具栏应停靠的目标边。如果在 CControlBar::EnableDocking 调用中所指定的边没有一个与框架窗口中为停靠启用的边匹配,则工具栏无法停靠(它将浮动)。
  21. 工具栏一旦浮动,将保持为浮动工具栏,不能停靠到框架窗口。
  22. 如果希望工具栏永久浮动,请调用参数为 0 的 EnableDocking。然后调用 CFrameWnd::FloatControlBar。工具栏将保持浮动,永远不能在任意位置停靠。
  23. */
  24. CFrameWnd::DockControlBar()//停靠工具栏
  25. /*
  26. 当用户试图将工具栏放置在允许停靠的框架窗口某一边时,框架调用 CFrameWnd::DockControlBar。
  27. 另外,可以随时调用该函数将控制条停靠在框架窗口中。这通常在初始化过程中完成。
  28. 框架窗口的具体某个边上可停靠多个工具栏。
  29. */
  30. CFrameWnd::FloatControlBar()//浮动工具栏
  31. /*
  32. 从框架窗口分离可停靠工具栏称为浮动工具栏。调用 CFrameWnd::FloatControlBar 来执行该操作。指定要浮动的工具栏、将放置的点以及决定浮动工具栏是水平还是垂直的对齐样式。
  33. 当用户拖动工具栏离开停靠位置并将它放置在一个未启用停靠的位置时,框架调用该函数。
  34. 这可以是框架窗口的内部或外部的任意位置。同 DockControlBar 一样,也可以在初始化过程中调用该函数。
  35. 可停靠工具栏的 MFC 实现不提供一些支持可停靠工具栏的应用程序中有的扩展功能。诸如可自定义工具栏这样的功能不提供。
  36. */
  37. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  38. {
  39. //...
  40. //部分代码略
  41. //...
  42. //调用CToolBar中的成员函数设置工具栏可停靠的位置
  43. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  44. //调用框架类中的成员函数设置哪里可以被停靠
  45. EnableDocking(CBRS_ALIGN_ANY);
  46. //Points to the control bar to be docked.
  47. DockControlBar(&m_wndToolBar);
  48. return 0;
  49. }

      demo3:点击菜单项显示和隐藏工具栏

C++代码
  1. demo3 (点击菜单项显示和隐藏工具栏)
  2. CFrameWnd::ShowControlBar//显示和隐藏菜单项
  3. void ShowControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );
  4. void CMainFrame::OnViewNewtool()
  5. {
  6. ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);//控制显示和隐藏
  7. }
  8. void CMainFrame::OnUpdateViewNewtool(CCmdUI* pCmdUI)
  9. {
  10. // TODO: Add your command update UI handler code here
  11. pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());//为菜单项打标记
  12. }
转自:http://www.jizhuomi.com/software/181.html

MFC工具栏的创建、设计与使用实例的更多相关文章

  1. VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)

    鸡啄米在上一节教程中讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建.停靠与使用. 工具栏的使用 上一节中鸡啄米提到过,一般情况下工具栏中的按钮在菜单栏中都有 ...

  2. MFC工具栏设计

    工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标来表示.当单击某个按钮时,会产生一个相应的消息,对这个消息的处理就是按钮的功能实现.将菜单中常用的功能放置在工具栏中,这样可以方便用户操作,省 ...

  3. T4学习- 2、创建设计时模板

    使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的关键 ...

  4. VS2010-MFC(工具栏:工具栏的创建、停靠与使用)

    转自:http://www.jizhuomi.com/software/217.html 上一节教程讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建.停靠与使 ...

  5. C++MFC编程笔记day03 MFC工具栏、状态栏、视图窗体

    MFC工具栏 相关类: CToolBarCtrl - 父类是 CWnd  封装了工具栏控件相关操作 CToolBar - 父类是CControlBar  封装了工具栏和框架窗体之间的关系 工具栏使用: ...

  6. 初学C#和MVC的一些心得,弯路,总结,还有教训(4)--Cache 关于创建多个缓存实例

    asp.net中的数据缓存可以用 HttpRuntime.Cache ,这个是大家都知道的,但如果缓存的数据比较多,又比较杂乱,想要把缓存分开管理(也就是创建多个缓存实例)应该怎么做呢... 于是常规 ...

  7. PHPExcel创建文件格式写入对象实例

    首先到http://www.codeplex.com/PHPExcel下载PHPExcel 下面就是php导出excel的程序 <?phpini_set("display_errors ...

  8. 李洪强iOS开发之OC[008] -创建一个对象并访问实例变量

    // //  main.m //  07 - 创建一个对象并且访问实例变量 // //  Created by vic fan on 16/7/3. //  Copyright © 2016年 李洪强 ...

  9. MFC应用程序创建窗口的过程 good

    MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该 ...

随机推荐

  1. Bulk Convert DOC to DOCX

    原文链接 :http://blogs.msdn.com/b/ericwhite/archive/2008/09/19/bulk-convert-doc-to-docx.aspx 帮助文档:http:/ ...

  2. linux常用命令之scp详解

    使用scp的前提: 1.服务端启动了sshd服务 2.是本地和远程两端的系统都必须要有scp这个命令.即openssh-clients软件包 [安装方法] [root@ ~]# yum install ...

  3. jstack命令的使用

    文章来源:https://blog.csdn.net/wufaliang003/article/details/80414267 jstack是java虚拟机自带的一种堆栈跟踪工具. jstack用于 ...

  4. VSCode集成TypeScript编译

    先安装github客户端和nodeJS客户端吧,直接去官网下载,nodeJS客户端安装完就集成了npm; 查看是否成功: git version  node -v npm-v 安装TypeScript ...

  5. thinkCMF----公共模板的引入

    这个主要用于前台模板的 头部和底部分离: 具体引入方法: <include file="public@source"/> <include file=" ...

  6. Spark2 探索性数据统计分析

    data数据源,请参考我的博客http://www.cnblogs.com/wwxbi/p/6063613.html import org.apache.Spark.sql.DataFrameStat ...

  7. Js中对id和class属性进行模糊查询

    如题,从例子说明: <div id="divid" class="divclass" > <a id="divid-a" ...

  8. 9.5Django操作数据库的增删改查

    2018-9-5 18:10:52 先贴上笔记 day61 2018-04-28 1. 内容回顾 1. HTTP协议消息的格式: 1. 请求(request) 请求方法 路径 HTTP/1.1\r\n ...

  9. iptables、防火墙配置、NAT端口映射

    一,配置一个filter表放火墙 (1)查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Chain INPUT (policy ACCEPT) targ ...

  10. Query实例的ajax应用之二级联动的后台是采用php来做的

    jQuery实例的ajax应用之二级联动的后台是采用php来做的,前台通过jquery的ajax方式实现二级联动数据库表设计 csj_trade id int(11) auto_increment  ...