【MFC】根据菜单创建工具栏
00. 目录
文章目录
- 00. 目录
- 01. 案例概述
- 02. 开发环境
- 03. 关键技术
- 04. 程序设计
- 05. 秘笈心法
- 06. 源码下载
- 07. 附录
01. 案例概述
通常工具栏能够实现的功能菜单也能实现,菜单有命令ID、图标、名称而工具栏也有,如果菜单项不是很多的话可以根据每个菜单项都创建一个工具栏按钮,实例就是实现根据菜单项创建工具栏。效果如下图所示:
02. 开发环境
系统环境:Windows 10
开发环境:Visual Studio 2019
03. 关键技术
实例的关键技术是如何获取所有的菜单项,首先使用CMenu类的LoadMenu方法加载指定ID的菜单资源。然后使用GetMenuItemCount获取菜单项的个数,然后使用GetSubMenu方法获取子菜单项,如果是级联菜单就继续获取获取子菜单下的菜单项个数,并遍历子菜单的菜单项,最后通过GetMenuItemInfo获取菜单项的内容并生成工具栏按钮。
04. 程序设计
(1)新建一个基于对话框的应用程序。
(2)在对话框初始化函数OnInitDialog中根据菜单创建工具栏,代码如下:
BOOL CMy3ToolBarDlg::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: 在此添加额外的初始化代码//创建图像列表m_ImageList.Create(32, 32, ILC_COLOR32 | ILC_MASK, 0, 0);CString strPath;HICON hIcon;//向图像列表中添加图标for (int i = 0; i < 10; i++){//获取图片的路径strPath.Format(TEXT(".\\res\\ico\\%02d.ico"), i);//加载图标hIcon = (HICON)::LoadImage(NULL, strPath, IMAGE_ICON, 32, 32, LR_LOADFROMFILE);m_ImageList.Add(hIcon);}//创建工具栏m_ToolBarCtrl.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, 154330);//工具栏支持自动化m_ToolBarCtrl.EnableAutomation();//设置工具栏图像列表m_ToolBarCtrl.SetImageList(&m_ImageList);TBBUTTON button[11];int i = 0;for (i = 0; i < 11; i++){button[i].dwData = 0;//工具栏按钮可用button[i].fsState = TBSTATE_ENABLED;//工具栏为按钮样式button[i].fsStyle = TBSTYLE_BUTTON;}int iMenuButtonCount = 0;MENUITEMINFO info;CString strMenuName;CMenu menuDlgMenu;CMenu* menuDlgSubMenu;//加载资源中的菜单menuDlgMenu.LoadMenuW(IDR_MyMenu);//父菜单数量int iMenuCount = menuDlgMenu.GetMenuItemCount();for (int j = 0; j < iMenuCount; j++){//获取子菜单menuDlgSubMenu = menuDlgMenu.GetSubMenu(j);//获取子菜单的个数int iSubMenuCount = menuDlgSubMenu->GetMenuItemCount();for (int k = 0; k < iSubMenuCount; k++){//获取菜单项的名称menuDlgSubMenu->GetMenuStringW(k, strMenuName, MF_BYPOSITION);button[iMenuButtonCount].idCommand = menuDlgSubMenu->GetMenuItemID(k);button[iMenuButtonCount].iBitmap = iMenuButtonCount % 9;button[iMenuButtonCount].iString = m_ToolBarCtrl.AddStrings(strMenuName);iMenuButtonCount++;if (iMenuButtonCount > 10){break;}}if (iMenuButtonCount > 10){break;}}this->SetMenu(&menuDlgMenu);m_ToolBarCtrl.AddButtons(iMenuButtonCount, button);m_ToolBarCtrl.AutoSize();m_ToolBarCtrl.SetStyle(TBSTYLE_FLAT | CCS_TOP);return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
05. 秘笈心法
工具栏按钮的生成
实例实现的是将较少的菜单项生成为工具栏按钮,也就是说在一行工具内就可以全部显示,如果菜单项较多的话,就需要创建多个工具栏来显示,这时可以根据根菜单项的个数来决定工具栏的个数。
06. 源码下载
下载:【MFC】根据菜单创建工具栏.rar
07. 附录
【MFC】根据菜单创建工具栏相关推荐
- MFC用代码创建工具栏
VC2012:单文档工程: 在主框架类头文件,原来的工具条变量之后,增加一个m_mywndToolBar变量: 在主框架类CPP文件,原来的创建工具栏函数后面,增加一个创建函数: 添加一个自己工具栏按 ...
- 使用VS的MFC应用创建单文档应用并添加对话框菜单和工具栏
本教程是基于Visual Studio 2019的VC++大作业. 市面上大部分书本教程都使用Microsoft Visual C++工具创建,VS的教程全网少之又少. 故而本教程给初学者避雷,以单文 ...
- 【MFC】带下拉菜单的工具栏
00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 本实例是对工具栏功能的 ...
- 【MFC】对话框中创建工具栏
00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 使用MFC向导可以创建 ...
- MFC应用的菜单,工具栏和状态栏(vs2019)
继续MFC的应用学习记录: 这次是菜单,工具栏,状态栏这三个功能实现: 第一步还是创建基于单文档的应用程序: 创建好后,打开资源视图: 功能1:菜单 在资源视图中找到Menu,打开ID_MAINFRA ...
- Qt4_创建菜单和工具栏
创建菜单和工具栏 绝大多数现代图形用户界面应用程序都会提供一些菜单.上下文菜单和工具栏.菜单可以让用户浏览应用程序并且可以学会如何处理一些新的事情,上下文菜单和工具栏则提供了对那些经常使用的功能进行快 ...
- MFC菜单、工具栏和状态栏
菜单:CMenu类 CMenu类的主要成员函数BOOL LoadMenu(UINT nIDResource);加载菜单资源,并将其附加到CMenu对象上.参数nIDResource指定了要加载的菜单资 ...
- MFC对话框中的工具栏、状态栏设计小结
对网上的资料结合自己的实践的总结,由于大部分都是网上先辈们的经验,这里只是直接将内容拿来,格式优化一下更易读而已. 对话框中建立工具栏的方法 工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标 ...
- 安装VS2019、MFC,并创建MFC工程文件,查看工程信息
安装VS2019.MFC.创建第一个MFC文件 1.安装VS2019 vs2019已经在4月2日正式发布,vs2019和vs2017一样强大,项目兼容,不用互相删除,而且C/C++,Python,F# ...
最新文章
- html css bootstrap,CSS Bootstrap是什么?
- “趣冷淡”怎么看?网络电话寻求共同语言
- mybatisplus执行sql语句_[MySQL]sql语句的执行流程
- C++ Stack 与String
- docker环境下solr6.0配置(中文分词+拼音)
- 【学习笔记】ABAP OOD设计模式 - 单例模式
- c++中的引用和指针
- C# 去重处理字符大小写
- 【Opencv系列】之显示图像以及使用鼠标截取图像局部区域进行放大
- OpenCV+MFC显示图像
- 【记录】JS回调函数(小例子)
- 新萝卜家园GhostXp Sp3电脑城装机极致版2012.08
- shapely包导入问题
- 当我真正开始爱自己,我才认识到,所有的痛苦和情感折磨,都...
- PVCBOT【27号】机械避役--线控变色龙机器人
- 2022.9.19 自学计算机
- STM32:PWM原理总结
- mathml_MathML简介–数学标记语言
- 初二生态系统思维导图_初中七八年级生物思维导图大全21张.pdf
- 储能之动力电池与储能电池区别?
热门文章
- 如何让listView加入的HeaderView不可点击【转】
- 【转载自codeproject】Another Look At IDisposable
- oracle 根据值不同具有不同的搜索条件_在Navicat Premium中执行数据库范围内的搜索...
- H3C TFTP操作示例
- Ant Design Pro+Electron+electron-builder实现React应用脱离浏览器,桌面安装运行
- Cookie防伪造防修改
- 「客户成功故事」OneAPM 助力网上办事大厅构建阳光、高效、安全的政务服务平台...
- jquery对radio的操作汇总
- vijos 1198 最佳课题选择
- spring beanFactory