MFC案例:自制工具条(Toolbar)按钮的小程序

news2025/2/22 15:43:04

       程序目标:在基于对话框的MFC项目中,自制三个 Toolbar 按钮(用颜色区分,分别为红、绿、蓝);程序运行时,单击红色按钮显示一个红色的填充椭圆;再单击绿色按钮则进行清屏;最后单击蓝色按钮退出程序。
       具体步骤如下:
       1、利用VS2022建立一个基于对话框的MFC应用,项目名称:myToolbar,具体步骤略。项目建好后,选择对话框界面,删去“TODO:*** ”、“确定”、“取消”等。然后右键对话框->属性->文字描述:myToolbar。
       2、结决方案资源管理器->右键资源文件->选择 Toobar ->新建。此时,会出现绘制位图按钮的界面,屏幕右上方有各种绘图工具,左上角有要编辑的按钮,靠近中间有放大图。我们要编辑的就是这个放大图。
       如果没有出现调色板,可以右键按钮选择 "显示颜色窗口" 即可出现。接着,利用绘图工具画出第一个红色按钮(用喷枪全喷成红色),再右键画好的红色按钮,将ID改为ID_RED;此时,在画好的红色按钮右边又出现了一个灰色按钮,点击它又出现绘图界面,我们将其喷成绿色,然后ID改为ID_GREEN;照方抓药,再弄一个蓝色的,ID改为ID_BLUE。每画好一个按钮,旁边就出现一个灰色的,不想再增加按钮时就不要点它了。一旦绘制按钮多了不想要,把它用鼠标拖出扔了即可。
       3、步骤2中的绘图编辑界面如果找不到了,可以通过视图 -> 其它窗口 -> 资源视图 -> 点开 Toobar -> 双击 IDR_TOOLBAR1 就可出现编辑界面。(IDR_TOOLBAR1就是我们要编辑的工具条的ID)
       4、到这一步后,暂时将绘图界面关上。下面开始给程序添加一些代码,实际上大量的结构性代码都是VS自动生成的,省了我们很多事,我们就先不管它了。以下是要增加的代码,代码及含义见注释。
       5、先找到 myToolbarDlg.h 文件,在public:下面声明一个工具条成员变量,代码:

CToolBar toolbar; //声明工具条成员变量

       6、再找到myToolbarDlg.cpp文件,在初始化程序 CmyToolbarDlg::OnInitDialog() 中添加下列代码,位置在"TODO:"之后:

	CWnd* pWnd = AfxGetApp()->GetMainWnd();
	toolbar.Create(pWnd); //工具栏的父窗口,直接写this也可;Create还有许多参数,这里全使用缺省值
	toolbar.LoadToolBar(IDR_TOOLBAR1); //加载工具条
	UINT arr[] = {ID_RED,ID_GREEN,ID_BLUE}; //把按钮数组化
	toolbar.SetButtons(arr, 3); //按钮赋给工具条
	RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //重置工具条,否则不显示

        此时,如运行程序,对话框上已经出现三个按钮,只是点击没有反应。
        7、再回到myToolbarDlg.h文件,在protect:下面声明三个按钮响应函数,代码:

	afx_msg void OnIDRed(); //画红色边线红色填充的椭圆
	afx_msg void OnIDGreen(); //恢复屏幕原来颜色
	afx_msg void OnIDBlue(); //恢复屏幕原来颜色

         因为这三个按钮是自己画的,所以使用类向导找不到(下面还有步骤也是这样),需要自己直接写上去。
      8、转到myToolbarDlg.cpp文件,找到对话框类的消息处理宏BEGIN_MESSAGE_MAP(CmyToolbarDlg, CDialogEx),在其中添加三个按钮的单击消息处理宏:

	ON_COMMAND(ID_RED, OnIDRed) //抛出点击红色工具按钮消息
	ON_COMMAND(ID_GREEN,OnIDGreen) //抛出点击绿色按钮消息
	ON_COMMAND(ID_BLUE, OnIDBlue) //抛出点击蓝色按钮消息

       此时,单击消息与处理函数之间已经建立的映射关系,只是函数没有实现。
       9、实现void CmyToolbarDlg::OnIDRed() 函数,位置在myToolbarDlg.cpp文件后边找个地方就行。全部代码如下:

//点击红色按钮的消息处理程序(绘制红色椭圆)
void CmyToolbarDlg::OnIDRed()
{
	CRect rect;//定义矩形类对象(格式化结构)
	GetClientRect(&rect);//全局函数获得客户区数据存入rect
	CDC* pDC = GetDC(); //定义设备上下文指针
	pDC->SetMapMode(MM_ANISOTROPIC);//映射模式(窗口模式确定为自定义)
	pDC->SetWindowExt(rect.Width(), rect.Height());//逻辑窗口尺寸
	pDC->SetViewportExt(rect.Width(), -rect.Height());//物理窗口尺寸,同时更改Y方向
	pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);//圆心确定
	rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);//将自定义坐标系重置rect
	rect.DeflateRect(50, 50);//将客户区矩形内缩50(防止画图画到工具条区域)
	CBrush redBrush(0x0000FF);//定义红色画刷(画刷颜色为封闭图的填充色)
	CBrush* pOldBrush = pDC->SelectObject(&redBrush);
	CPen redPen(PS_SOLID, 1, 0x0000FF);	//定义一个画笔:红色实线(16进制红颜色为0xbbggrr)
	CPen* pOldPen = pDC->SelectObject(&redPen); //将画笔选入
	int x = rect.Width() / 2;
	int y = rect.Height() / 2;
	pDC->Ellipse(-x, y, x, -y); //以缩小后的1/2客户区矩形高、宽为长短半径做椭圆
	pDC->SelectObject(pOldBrush);//恢复缺省画刷
}

        10、实现void CmyToolbarDlg::OnIDGreen(),位置挨着上一个程序即可,代码如下:

//点击绿色按钮的消息处理程序(清空窗口)
void CmyToolbarDlg::OnIDGreen()
{
	CRect rect;//定义矩形类对象(格式化结构)
	GetClientRect(&rect);//全局函数获得客户区数据存入rect
	rect.DeflateRect(50, 50);//将客户区矩形内缩50(防止恢复颜色影响工具条区域)
	CDC* pDC = GetDC(); //定义设备上下文指针
	pDC->FillSolidRect(&rect, GetSysColor(COLOR_3DFACE));//sysBKcolor
}

        11、实现void CmyToolbarDlg::OnIDBlue(),位置还是挨着上一个,代码如下:

//点击蓝色按钮的消息处理程序(退出)
void CmyToolbarDlg::OnIDBlue()
{
	MessageBox(L"程序即将关闭...");
	CDialog::OnOK(); //调用OnClose不能关闭对话框,故调用OnOK
}

       12、运行效果截图:
        a. 显示红色椭圆截图


     b. 清屏后、退出前界面截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【YOLO 系列】基于YOLO V8的密集场景下行人检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

前言 在密集的城市环境中,行人检测对于公共安全、交通管理和智能监控具有重要意义。然而,传统的行人检测方法在面对密集场景时,常常因目标重叠和遮挡而难以准确识别。为了应对这一挑战,我们启动了这个项目,目的是利用…

江苏隆昌化工上线隆道平台 采购管理迎来全面升级

当前,传统产业与数字产业深度加速融合,大数据、云计算、人工智能等新技术推动产业深刻变革,能源化工行业迎来战略转型加速期。数字化转型已成为能源化工企业提升运营效率、控制运营成本、提高产品质量、打造竞争优势的强大引擎。为实现传统采…

OVS:网桥的状态:fail_mode模式

目录 1.创建一个普通的ovs网桥不做任何配置 2.检测fail_mode值,默认为空 3.创建netns并配置sto网桥的两个普通端口并配置IP信息 4.默认情况下的两个端口下挂两个虚拟机v3,v4天然通信-ping-ok 5.修改网桥的fail_mode为standalone,原来的通信没有影响 6.修改了…

java常用类(1)

目录 1.Object类 1.1 toString()方法 1.1.1重写toString()方法 2.1 equals()方法 2.1.1 的作用 2.1.2 equals()方法 2.Arrays类 2.1 equals()方法 2.2 copyOf()方法 2.3 fill()方法 2.4 sort()方法 1.Object类 在java中Object类是所有类的父类,如果一个类没有显示…

数据独立性-信息、数据、数据结构、数据独立性

一、引言 同人工管理数据和文件系统管理数据相比,数据库管理数据最主要的优点是数据独立性高。数据独立性是数据库领域中的一个常用术语和重要概念,包括数据的物理独立性和逻辑独立性 二、数据与数据结构 1、信息 在数据管理领域,数据与信…

排序之插入排序----直接插入排序和希尔排序(1)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 排序之插入排序----直接插入排序和希尔排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记,欢迎大家在评论区交流讨…

uni-app uni-data-picker级联选择器无法使用和清除选中的值

出现问题&#xff1a; 使用点击右边的叉号按钮无法清除已经选择的uni-data-picker值 解决办法&#xff1a; 在uni-app uni-data-picker使用中&#xff0c;要添加v-model&#xff0c;v-model在官网的示例中没有体现&#xff0c;但若不加则无法清除。 <uni-data-picker v-m…

从0搭建一个vue项目,不使用脚手架从html到vue

前言 从最开始学习web网页开始&#xff0c;搭建一个网页只需要创建一个html文件对其进行编写dom标签语言即可&#xff1b;后来分离了html&#xff0c;css和js&#xff0c;搭建一个网页开始需要文件夹&#xff0c;文件夹包含了这3类文件以及静态文件&#xff0c;图片&#xff0c…

2024年全新Studio One 6 .6.1新功能介绍及安装激活使用指南

​ 录制、制作、混音、掌握和表演所需的一切。Studio One 6 .6.1通过新的智能模板、直观的拖放工作流程、可定制的用户界面和强大的集成工具&#xff0c;让创作变得快速而轻松。 智能模板。快速启动。 快速启动录音、混音、掌握、节拍制作或简单地演奏虚拟乐器的基本工作流程—…

#04贪心法

要点&#xff1a; 贪心法的基本思想、基本要素与求解步骤&#xff1b; 贪心法的应用。 难点&#xff1a; 贪心法的最优子结构性质与贪心选择性质。 贪心法的基本思想 每个阶段的决策一旦做出就不可更改。不允许回溯。 并不从整体最优考虑&#xff0c;所作出的选择只是在某…

视频素材网站哪个好用?好用的做短视频素材下载网站分享

你是否正面临着为短视频寻找完美素材的困扰&#xff1f;是否对网络上那些雷同的素材网站感到厌烦了&#xff1f;今天&#xff0c;我将为大家推荐几个优秀的海外视频素材网站&#xff0c;这些隐藏的宝藏网站定能让你的作品焕发新光彩&#xff01; 蛙学素材网——您的创作好帮手…

希望数学少年俱乐部精品课学生用书-四年级

PDF版本链接链接&#xff1a;https://pan.baidu.com/s/1t6prtG9sd-1mYsnCUz-mKQ 提取码&#xff1a;0548 --来自百度网盘超级会员V7的分享

《编译原理》阅读笔记:p19-p24

《编译原理》学习第 4 天&#xff0c;p19-p24总结&#xff0c;总计 5 页。 一、技术总结 1.grouping of phases 这里谈到分组(group)&#xff0c;那么就会有一个疑问&#xff0c;分组的依据是什么&#xff1f;即根据什么来分组。 (1) front end & back end 编译器包含…

办公效率神器:ONLYOFFICE 的配置和使用

1.认识 ONLYOFFICE ONLYOFFICE 是一款免费开源的协同办公软件套件&#xff0c;支持多种文件格式&#xff0c;包括PDF、Word、Excel、PowerPoint等。它提供了文档编辑、表格处理、演示制作等功能&#xff0c;并可以与其他应用程序和平台集成&#xff0c;功能亮点特点如下&#…

【unity笔记】六、UI实现下拉列表切换视角

具体步骤如下 1. 创建UI下拉列表&#xff1a; 在Unity场景中右键点击并选择UI -> 下拉列表 来创建一个新的下拉列表。 2. 添加摄像机选项&#xff1a; 在Dropdown的Options属性中添加新的选项&#xff0c;通过点击按钮来添加选项&#xff0c;并为每个选项设置一个显示名…

【大数据】—谁是世界上最富的人?

引言 在2024年&#xff0c;全球财富的分布再次成为公众和经济学家关注的焦点。随着经济的波动和新兴市场的崛起&#xff0c;亿万富翁的名单也在不断变化。本文将深入探讨这一现象&#xff0c;通过最新的数据可视化分析&#xff0c;揭示世界上最富有的人在2024年的财富状况和趋…

成都百洲文化传媒有限公司助力电商品牌乘风破浪

在当今数字化时代&#xff0c;电商行业风起云涌&#xff0c;竞争异常激烈。成都百洲文化传媒有限公司凭借其对电商行业的深刻理解与实战经验&#xff0c;已然成为行业中的佼佼者。公司专注于电商服务领域&#xff0c;通过创新的营销模式和精准的市场策略&#xff0c;助力众多品…

#03动态规划

要点&#xff1a; 动态规划方法与贪心法、分治法的异同&#xff1b; 动态规划方法的基本要素与求解步骤&#xff1b; 动态规划方法的应用。 难点&#xff1a; 如何根据问题的最优子结构性质构造构造动态规划方法中的递归公式或动态规划方程。 动态规划的基本思想 动态规…

使用Servlet开发javaweb,请求常见错误详解及其解决办法【404、405、500】

Servlet报错的情况多种多样&#xff0c;涵盖了配置错误、代码逻辑错误、资源未找到、权限问题等多个方面。以下是一些常见的Servlet报错情况及其可能的原因和解决方法&#xff1a; 404 Not Found: 错误原因图示&#xff1a; URL映射 发送请求&#xff0c;出现404错误 原因: 请…

excel隐藏的部分内容如何显示出来?3个方法帮助你!

excel隐藏的部分如何显示出来&#xff1f;你是否曾经在Excel中遇到过某些单元格被隐藏&#xff0c;或者某些数据在编辑时突然消失&#xff0c;让你感到困惑和无助&#xff1f;不要担心&#xff0c;今天我将向你揭示如何解决这些问题&#xff0c;让你轻松显示隐藏的部分。 方法1…