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);//全局函数获得客户区数据存入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. 清屏后、退出前界面截图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于AT89C52单片机的超声波测距设计—数码管显示

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89456475?spm=1001.2014.3001.5503 C 源码+仿真图+毕业设计+实物制作步骤+10 在这里插入图片描述 题 目: 基于52的超声波测距汽车防撞系统 学生姓名 [姓名] 学 号 [学号…

力扣921. 使括号有效的最少添加

Problem: 921. 使括号有效的最少添加 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义int变量res、need分别记录需要插入的左括号数和所需与左括号配对的右括号数; 2.遍历字符串: 2.1.若当为左括号,则need,表示…

QT拖放事件之八:通过全局剪切板中的接口QClipboard::mimeData()来获取MIME类型数据

1、演示效果 首先向剪切板写入数据,然后点击paste按钮进行从全局剪切板中 获取 MIME数据。。。 2、核心代码 void Widget::on_pasteBtn_clicked() {const QClipboard* clipBoard = QGuiApplication::clipboard()

win10修改远程桌面端口,Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南

Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南 一、修改Windows 10远程桌面端口 在Windows 10系统中,远程桌面连接默认使用3389端口。为了安全起见,建议修改此端口以减少潜在的安全风险。以下是修改远程桌面端口的步骤: 1. 打…

qt 简单实验 一个可以向右侧拖拽缩放的矩形

1.概要 目的是设置一个可以拖拽缩放的矩形,这里仅用右侧的一个边模拟这个过程。就是为了抓住核心,这个便解决了,其他的边也是一样的。而这个更能体现原理。 2.代码 2.1 resizablerectangle.h #ifndef RESIZABLERECTANGLE_H #define RESIZ…

瞄准Windows的新兴僵尸网络:Kraken

2021 年 10 月,ZeroFox Intelligence 披露了名为 Kraken 的僵尸网络。Kraken 通过 SmokeLoader 进行传播,每次更新攻击基础设施时都会扩大规模。尽管与 2008 年发现的 Kraken 僵尸网络同名,但二者并没有其他共同点。 功能 自从 2021 年 10 …

Redis 集群 - 数据分片算法

前言 广义的集群:只要是多个机器构成了一个分布式系统,都可以被称为集群。 狭义的集群:redis 的集群模式,这个集群模式下,主要是解决存储空间不足的问题。 Redis 集群 redis 采用主从结构,可以提高系统的可…

【FFmpeg】avformat_open_input函数

【FFmpeg】avformat_open_input函数 1.avformat_open_input1.1 初始化输入格式(init_input)1.1.1 文件路径判断格式(av_probe_input_format2)1.1.1.1 格式探测(read_probe)1.1.1.2 扩展匹配检查&#xff08…

【链表经典算法OJ题】(2)

4.链表的中间节点 单链表相关经典算法OJ题4: 链表的中间结点 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problem…

mmpose姿态估计

OpenMMLab GitHubOpenMMLab has 49 repositories available. Follow their code on GitHub.https://github.com/open-mmlab Installation — MMPose 1.3.1 documentationhttps://mmpose.readthedocs.io/en/latest/installation.html Body 3D Keypoint — MMPose 1.3.1 docume…

Linux_应用篇(27) CMake 入门与进阶

在前面章节内容中,我们编写了很多示例程序,但这些示例程序都只有一个.c 源文件,非常简单。 所以,编译这些示例代码其实都非常简单,直接使用 GCC 编译器编译即可,连 Makefile 都不需要。但是,在实…

关于导入springcloud项目一些jar加载不进去的问题处理

IntelliJ IDEA的Maven项目有时候通过右边Maven Projects面板的package或者install命令打包的时候,会报错导致打包失败,这是由于这两个命令打包前默认会运行tests测试,若测试失败则打包失败。但是有时候我们打包的时候一些项目配置是针对生产环…

Studio One 6.6.2中文破解版安装图文激活教程

Studio One 6.6.2中文破解版做为新生代音乐工作站,凭借更低的价格和完备的功能,获得了音乐人和直播行业工作者的青睐,尤其是对硬件声卡的适配支持更好,特别适合用来配合线上教学和电商带货。 最近网上出现不少关于StudioOne不能用…

吃鸡报错:请重新安装软件xinput1_3.dll怎么办,分享几种靠谱的解决方法

xinput1_3.dll 是 Microsoft DirectX 的一个重要组件,主要用于处理游戏控制器和其他输入设备的交互操作。当运行支持 DirectX 的游戏或程序时,xinput1_3.dll 文件会被操作系统加载到内存中,以提供输入设备的相关功能。如果 xinput1_3.dll 文件…

51单片机STC89C52RC——8.1 8*8 LED点阵模块(点亮一个LED)

目录 目的/效果 一,STC单片机模块 二,8*8 LED点阵模块 2.1 电路图 2.1.1 8*8 点阵模块电路图 2.1.2 74HC595(串转并)模块 电路图 2.1.3 芯片引脚 2.2 引脚电平分析 2.3 74HC595 串转并模块 2.3.1 装弹(移位…

计算机网络之入门

1.网络的发展 1.1计算机网络定义 计算机网络是以共享资源(硬件、软件和数据等)为目的而连接起来的、在协议控制下,由一台或多台计算机、若干台终端设备、数据传输设备等组成的系统之集合。 这些计算机系统应当具有独立自治的能力&#xff…

PHP+laravel 生成word

此功能较为繁琐我会从源头讲起 首先是数据库设置,下面是我的数据库结构 合同模版表 CREATE TABLE contract_tpl (id bigint unsigned NOT NULL AUTO_INCREMENT,name varchar(191) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 合同名称,file varchar(191) COLL…

redis集群简单介绍及其搭建过程

Redis集群 1、哨兵模式 哨兵可以有多个,从服务器也可以有多个,从服务器也可以有多个,在Redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会实现主从切换&#x…

WMV 视频格式怎么转换?WMV 视频为什么不流行了?

目前有越来越多的视频格式类型,如常见的 MP4、FLV、AVI 等等,而技术的演变也逐渐让一些常见的视频格式变的越来越少了。 今天我们一起来聊下 WMV 这个视频格式,让我们看看它的发展以及为什么现在越来越少人使用了。 什么是 WMV 视频格式&…

沙姆镜头标定与重建

沙姆定律( Scheimpflug principle)则可以保证测量平面的物体能够清晰成像, 因此能够起到调整景深区域位置的作用。Scheimpflug 镜头就是根据沙姆定律所设计的一种特殊的镜头,通过机械结构使镜头与相机本体发生一定程度的偏转&…