MFC工具栏的创建、设计与使用实例
本文通过实例说明MFC工具栏的创建、设计和使用方法,包括三个demo。
demo1:创建一个工具栏
- //摘抄自MSDN
- demo1 (创建一个工具栏)
- 1.Create a toolbar resource.
- /*可以先插入一个新的工具栏资源
- 添加分隔符,将按钮向右拖动一小下
- 删除按钮,将按钮拖动出工具栏
- */
- 2.Construct the CToolBar object.
- /*
- 工具栏是 CToolBar 对象,声明为应用程序的 CMainFrame 类的数据成员。也就是说,工具栏对象嵌入到主框架窗口对象中。这意味着 MFC 在创建框架窗口时创建工具栏,在销毁框架窗口时销毁工具栏。
- */
- 3.Call the Create (or CreateEx) function to create
- the Windows toolbar and attach it to the CToolBar object.
- 4.Call LoadToolBar to load the toolbar resource.
- /*
- 工具栏创建发生在 CMainFrame::OnCreate 中。MFC 在创建框架窗口之后且在窗口可见之前调用 OnCreate。
- 在 OnCreate 中调用适当的函数来停靠或浮动工具栏、设置它的样式等。
- 应用程序向导”生成的默认 OnCreate 执行以下工具栏任务:
- 1.调用 CToolBar 对象的 Create 成员函数来创建基础 CToolBarCtrl 对象。
- 2.调用 LoadToolBar 来加载工具栏资源信息。
- 3.调用函数来启用停靠、浮动和工具提示。
- */
- class CMainFrame : public CMDIFrameWnd
- {
- // ...
- // Implementation
- // ...
- protected: // control bar embedded members
- CStatusBar m_wndStatusBar;
- CToolBar m_wndToolBar;
- // Generated message map functions
- protected:
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- DECLARE_MESSAGE_MAP()
- };
- int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
- return -1;
- //框架类中m_wndMyToolBar成员变量先调用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(IDR_MYTOOLBAR))
- {
- TRACE0("Failed to create toolbar\n");
- return -1; // fail to create
- }
- //调用CToolBar中的成员函数设置工具栏可停靠的位置
- m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
- //调用框架类中的成员函数设置哪里可以被停靠
- EnableDocking(CBRS_ALIGN_ANY);
- //Points to the control bar to be docked.
- DockControlBar(&m_wndToolBar);
- return 0;
- }
demo2:停靠和浮动工具栏
- demo2 (停靠和浮动工具栏)
- /*
- 如果使用“应用程序向导”来生成应用程序的主干,向导将要求您选择是否想要可停靠的工具栏。
- 默认情况下,“应用程序向导”生成代码来执行将可停靠工具栏放置在应用程序中所需的三个操作:
- 1.在框架窗口中启用停靠。
- 2.为工具栏启用停靠。
- 3.停靠工具栏(靠向框架窗口)。
- 如果这些步骤中的任何一个缺少,应用程序都将显示标准工具栏。
- 后两个步骤对应用程序中的每一个可停靠工具栏都必须执行。
- */
- CFrameWnd::EnableDocking()//在框架窗口中启用停靠
- /*
- 若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。
- 这可通过使用 CFrameWnd::EnableDocking 函数来实现,该函数采用一个 DWORD 参数,这是一组指示框架窗口的哪一个边接受停靠的样式位。
- 如果一个工具栏即将停靠并且有多个边可以停靠,则在传递给 EnableDocking 的参数中指示的边按以下顺序使用:顶边、底边、左边、右边。
- 如果希望能够将控制条停靠在任意位置,请将 CBRS_ALIGN_ANY 传递给 EnableDocking。
- */
- CControlBar::EnableDocking()//为工具栏启用停靠
- /*
- 准备好停靠目标后,必须以相似的方式准备工具栏(或源)。为想要停靠的每一个工具栏调用 CControlBar::EnableDocking,指定工具栏应停靠的目标边。如果在 CControlBar::EnableDocking 调用中所指定的边没有一个与框架窗口中为停靠启用的边匹配,则工具栏无法停靠(它将浮动)。
- 工具栏一旦浮动,将保持为浮动工具栏,不能停靠到框架窗口。
- 如果希望工具栏永久浮动,请调用参数为 0 的 EnableDocking。然后调用 CFrameWnd::FloatControlBar。工具栏将保持浮动,永远不能在任意位置停靠。
- */
- CFrameWnd::DockControlBar()//停靠工具栏
- /*
- 当用户试图将工具栏放置在允许停靠的框架窗口某一边时,框架调用 CFrameWnd::DockControlBar。
- 另外,可以随时调用该函数将控制条停靠在框架窗口中。这通常在初始化过程中完成。
- 框架窗口的具体某个边上可停靠多个工具栏。
- */
- CFrameWnd::FloatControlBar()//浮动工具栏
- /*
- 从框架窗口分离可停靠工具栏称为浮动工具栏。调用 CFrameWnd::FloatControlBar 来执行该操作。指定要浮动的工具栏、将放置的点以及决定浮动工具栏是水平还是垂直的对齐样式。
- 当用户拖动工具栏离开停靠位置并将它放置在一个未启用停靠的位置时,框架调用该函数。
- 这可以是框架窗口的内部或外部的任意位置。同 DockControlBar 一样,也可以在初始化过程中调用该函数。
- 可停靠工具栏的 MFC 实现不提供一些支持可停靠工具栏的应用程序中有的扩展功能。诸如可自定义工具栏这样的功能不提供。
- */
- int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- //...
- //部分代码略
- //...
- //调用CToolBar中的成员函数设置工具栏可停靠的位置
- m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
- //调用框架类中的成员函数设置哪里可以被停靠
- EnableDocking(CBRS_ALIGN_ANY);
- //Points to the control bar to be docked.
- DockControlBar(&m_wndToolBar);
- return 0;
- }
demo3:点击菜单项显示和隐藏工具栏
- demo3 (点击菜单项显示和隐藏工具栏)
- CFrameWnd::ShowControlBar//显示和隐藏菜单项
- void ShowControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );
- void CMainFrame::OnViewNewtool()
- {
- ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);//控制显示和隐藏
- }
- void CMainFrame::OnUpdateViewNewtool(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());//为菜单项打标记
- }
MFC工具栏的创建、设计与使用实例的更多相关文章
- VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)
鸡啄米在上一节教程中讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建.停靠与使用. 工具栏的使用 上一节中鸡啄米提到过,一般情况下工具栏中的按钮在菜单栏中都有 ...
- MFC工具栏设计
工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标来表示.当单击某个按钮时,会产生一个相应的消息,对这个消息的处理就是按钮的功能实现.将菜单中常用的功能放置在工具栏中,这样可以方便用户操作,省 ...
- T4学习- 2、创建设计时模板
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件. 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码. 模型是包含有关应用程序要求的关键 ...
- VS2010-MFC(工具栏:工具栏的创建、停靠与使用)
转自:http://www.jizhuomi.com/software/217.html 上一节教程讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建.停靠与使 ...
- C++MFC编程笔记day03 MFC工具栏、状态栏、视图窗体
MFC工具栏 相关类: CToolBarCtrl - 父类是 CWnd 封装了工具栏控件相关操作 CToolBar - 父类是CControlBar 封装了工具栏和框架窗体之间的关系 工具栏使用: ...
- 初学C#和MVC的一些心得,弯路,总结,还有教训(4)--Cache 关于创建多个缓存实例
asp.net中的数据缓存可以用 HttpRuntime.Cache ,这个是大家都知道的,但如果缓存的数据比较多,又比较杂乱,想要把缓存分开管理(也就是创建多个缓存实例)应该怎么做呢... 于是常规 ...
- PHPExcel创建文件格式写入对象实例
首先到http://www.codeplex.com/PHPExcel下载PHPExcel 下面就是php导出excel的程序 <?phpini_set("display_errors ...
- 李洪强iOS开发之OC[008] -创建一个对象并访问实例变量
// // main.m // 07 - 创建一个对象并且访问实例变量 // // Created by vic fan on 16/7/3. // Copyright © 2016年 李洪强 ...
- MFC应用程序创建窗口的过程 good
MFC应用程序中处理消息的顺序 1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该 ...
随机推荐
- fs-extra 文件管理
一.fs-extra 文件管理 $npm install fs-extra --save 1.创建一个目录 fs.mkdir(path, [mode], [callback(err)]) path 将 ...
- Java环境变量配置错误
1,由于Java的环境变量配置错误,导致用到Java的编译过程中出现错误: 改正办法: wget http://download.oracle.com/otn-pub/java/jdk/8u181-b ...
- MFC创建好的对话框如何移植到新程序中
1.用文本文件打开需要移植对话框工程中的rc文件 2.在RC文件夹中找到需要移植的对话框内容,然后拷贝到新的工程的rc文件中 3.在原有工程的rsource.h中所有和这个对话框有关的ID都拷贝到新的 ...
- vim与终端的切换
在vim中按ctrl+z,可以stop vim退出到终端. 在终端工作完后,想要返回vim,则输入fg然后回车. ref: linux任务控制的几个技巧ctrl+z,fg,bg,jobs,kill
- openstack 部署(Q版)-----glance镜像服务安装配置
一.创建数据库 CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO '; GRANT ALL PRIVILEGES ON glanc ...
- ubuntu16.04下安装ros-kinetic
参考:http://wiki.ros.org/kinetic/Installation/Ubuntu 1.添加ROS软件源 ~$ sudo sh -c 'echo "deb http://p ...
- 快速排序之python
快速排序( Quick sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行递归排序,以达到整个序列有 ...
- Kubernetes网络的4种解决方案
一.Kubernetes + Flannel Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的 ...
- 洛谷P3368 树状数组2 树状数组+差分
正解:树状数组+差分 解题报告: 戳我! 不得不说灵巧真滴是越来越弱了...连模板题都要放上来了QAQ 因为今天考试的T3正解要用到树状数组这才惊觉树状数组掌握得太太太太差了...之前一直靠线段树续着 ...
- Git使用常见问题脚本
receive.denyCurrentBranch 这是由于git默认拒绝了push操作,需要进行设置,修改.git/config添加如下代码: [receive] denyCurrentBr ...