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

       程序目标:在基于对话框的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);//全局函数获得客户区数据存入rectCDC* 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);//将自定义坐标系重置rectrect.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);//全局函数获得客户区数据存入rectrect.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.mzph.cn/pingmian/35200.shtml

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

相关文章

[hive] posexplode生成从去年一月一号,到本月的月时间表

生成从去年一月一号,到本月的月时间表 posexplode用法: lateral view 表别名 as 序号列名,数组中的元素的名 1、生成序列 SELECT time_stamp_fist_day_of_last_year,--去年第一天的时间戳numfrom(SELECTsplit(repeat_o,,) o_array,time_stamp_fist_da…

用英文介绍纽约:NEW YORK, USA‘s MEGACITY

NEW YORK, USA’s MEGACITY | America’s Largest City Link: https://www.youtube.com/watch?vdzjQ-akB3BI&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index24 The story of New York City, America’s megalopolis. Summary Paragraph 1: The Historical Developm…

Chrome插件:​Vue.js Devtools 高效地开发和调试

在现代前端开发中,Vue.js因其灵活性和性能优势,受到越来越多开发者的青睐。然而,随着项目规模的扩大,调试和优化变得愈发复杂。幸运的是,Vue.js Devtools的出现,为开发者提供了一套强大的工具集&#xff0c…

vue大屏适配方案

前言 开发过大屏的铁汁们应该知道,前期最头疼的就是大屏适配,由于大屏项目需要在市面上不是很常见的显示器上进行展示,所以要根据不同的尺寸进行适配,今天我将为大家分享的我使用的大屏适配方案,话不多说,直…

Matlab|风光及负荷多场景随机生成与缩减

目录 1 主要内容 计算模型 场景生成与聚类方法应用 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序方法复现了《融合多场景分析的交直流混合微电网多时间尺度随机优化调度策略》3.1节基于多场景技术的随机性建模部分,该部分是随机优化调度的重要组成部分…

轻松掌握:工科生如何高效阅读国际期刊和撰写论文(下)

⭐️我叫忆_恒心,一名喜欢书写博客的研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支…

透明屏幕的魅力:为何它如此受欢迎

在科技日新月异的今天,透明屏幕技术以其独特的魅力和广泛的应用前景,逐渐成为了科技领域的一颗璀璨明星。从智能手机、平板电脑到大型显示屏,透明屏幕技术以其前所未有的视觉体验和实用性,赢得了广大消费者的喜爱。 一、透明屏幕的…

docker 镜像突然拉取不了,教你解决

最近我们可以发现,在Linux系统里拉取不了镜像了,翻墙也拉取不了,这时候我们可以有一个新的docker 镜像同步网站来解决这个问题 一、首先打开镜像官网(需要翻墙) https://hub.docker.com/ 然后搜索一个镜像 搜索最新…

Nginx实战:简单登录验证配置(基于openssl)

本文提供的是基于openssl创建的密码文件,对nginx指定的location访问。进行登录验证的配置方式。 1、验证页面配置 我的nginx实验环境是直接yum安装的,如果是自己编译安装的那么对应目录就是自己安装配置的目录。 先在/usr/share/nginx/html下创建一个usertest.html,里面添加…

Spring Cache常见问题解决

目录 一 报错:Null key returned for cache operation 二 报错:类型转换异常 三 取出的数据为null 一 报错:Null key returned for cache operation 这里报错有两种情况: 第一,如果你在新增的方法上使用Cacheable注解,那么肯定是…

绝望中迎来曙光,阿里大模型算法岗 Offer 突然来了!

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

用定时器T1中断控制两个LED以不同周期闪烁

#include<reg51.h> // 包含51单片机寄存器定义的头文件 sbit D1P2^0; //将D1位定义为P2.0引脚 sbit D2P2^1; //将D2位定义为P2.1引脚 unsigned char Countor1; //设置全局变量&#xff0c;储存定时器T1中断次数 unsigned char Countor2; //设置全局变量&#xff0c;储…

virutalBox安装debian并配置docker环境

下载镜像 https://gemmei.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso 虚拟机安装 如何在Virtual Box 上安装Debian系统_virtual box debian iso netinst-CSDN博客 启动命令行模式 如何设置Debian图形启动或命令行界面启动&#xff1…

什么是Cookie?有什么用?如何清除浏览器中的Cookie?

互联网上的每一次点击和每一个选择都可能被一种名为Cookie的技术记录下来。但Cookie是什么&#xff1f;我们在网站上登录时&#xff0c;为什么经常会被问及是否接受Cookie&#xff1f;接受Cookie登录会不会影响我们的在线隐私&#xff1f; Cookie是什么&#xff1f; Cookie是一…

S-Clustr(影子集群)V3 高并发,去中心化,多节点控制

S-Clustr 项目地址:https://github.com/MartinxMax/S-Clustr/releases/tag/S-Clustr-V3.0 Maptnh Не ограничивайте свои действия виртуальным миром. GitHub: Maptnh Jay Steinberg Man kann die Menschen, die man hasst, in d…

体育赛事翻译欧洲杯足球翻译术语分享

欧洲杯又称欧洲足球锦标赛&#xff0c;是世界上受欢迎和具影响力的国际体育赛事之一&#xff0c;有关足球翻译的术语分享如下&#xff1a; penalty mark (点球)罚球点,midfielder 前卫,center forward 中锋 full back 后卫,bicycle kick / overhead kick 倒钩球,chest-high ba…

如何用Vue3打造一个交互式数据统计仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 代码相关技术博客 1. 代码应用场景介绍 本代码示例展示了一个用于展示统计数据的仪表盘界面。它适用于需要可视化跟踪和分析各种指标的应用程序&#xff0c;例如财务管理、健康监测和商业智能。 2. 代码基本…

机器学习-保存模型并根据模型进行预测 python demo

文章目录 前言机器学习-保存模型&#xff0c;根据模型进行预测python demo1. 将我们创建的线性回归模型保存到本地2. 利用我们保存的模型进行房价预测 demo2. 利用我们保存的模型生成对应的预测线性图 demo 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评…

国密SSL证书提升网络安全

随着数字化时代的到来&#xff0c;网络安全已经成为全球关注的焦点。在这种背景下&#xff0c;SSL证书作为保护数据传输安全的重要工具&#xff0c;其重要性日益凸显。 数字证书产品有以下几种类别&#xff1a; 单域名SSL证书&#xff1a;为单一网站提供安全保护。 多域名SS…

【PyTorch函数解析】einsum的用法示例

一、前言 einsum 是一个非常强大的函数&#xff0c;用于执行张量&#xff08;Tensor&#xff09;运算。它的名称来源于爱因斯坦求和约定&#xff08;Einstein summation convention&#xff09;&#xff0c;在PyTorch中&#xff0c;einsum 可以方便地进行多维数组的操作和计算…