MFC图形函数学习04——画矩形函数

       MFC中绘制矩形函数是MFC的基本绘图函数,它的大小和位置由左上角和右下角的坐标决定;若想绘制的矩形边框线型、线宽、颜色以及填充颜色都还需要其它函数的配合。
一、绘制矩形函数
       原型:BOOL Rectangle(int x1,int y1,int x2,int y2);
       参数:x1,y1矩形左上角坐标,x2,y2矩形右下角坐标
       返回值:矩形绘制成功返回非0数,失败返回0
      说明:
      a.Rectangle函数是CDC类的成员函数,需要CDC类对象或指针调用。
      b.绘制的矩形不包括右边界和下边界,它的宽度为x2-x1,高度y2-y1
      c.与绘制直线函数相似,直接使用绘制矩形函数画矩形也是按照缺省设置绘制的;画出的矩形边框为1个像素宽的黑色实线、内部填充为白色(与矩形外相同)。
     d.绘制的矩形内部如不是透明的,原位置上的已有图形会被覆盖。
二、矩形边框线宽、线型、颜色使用CPen设置,同画线中的介绍,不再重复);下面介绍填充颜色的设置
  (1)生成实体画刷(可以这样理解:画笔是画线的,画刷是画面的)
       原型:BOOL CreateSolidBrush(COLORREF color);
       参数:COLORREF类型的颜色值
       返回值:成功返回非0数值,失败返回0
       说明:
       a.CreateSolidBrush是CBrush类的成员函数,因此需要CBrush对象或指针调用。
       b.画刷颜色为均匀颜色的单一颜色。
       c.这里再介绍一种COLORREF类型颜色值的写法,直接使用6位十六进制值表示RGB颜色值,不过颜色值的排列顺序是B、G、R且必须是16进制数。举例:0x00bbff,其中00代表blue分量,bb代表green分量,ff代表红色分量。
       d.由CBrush对象调用CreateSolidBrush()生成的实体画刷类似于CPen生成的画笔,都需要使用CDC类的成员函数SelectObject()将画笔选入CDC对象中;同样的,也需要接收作为SelectObject()返回值的缺省画刷,待自定义画刷使用完毕后恢复。
       e.画刷如需重定义,重定义前应先调用其成员函数DeleteObject()进行清理。
   (2)生成带花纹画刷
       原型:BOOL CreateHatchBrush(int nIndex,COLOREF color);
       参数:参1 花纹形式值 参2 颜色
       返回值:成功返回非0数值,失败返回0
       a.参1 的取值
        HS_BDIAGONAL:为左高右低的45度斜花纹。
        HS_CROSS:为由水平线和垂直线构成的方格花纹。
        HS_DIAGCROSS:为斜45度方格花纹。
        HS_FIDAGONAL:为右高左低的45度斜花纹。
        HS_HORIZONTAL:为水平线花纹。
        HS_VERTICAL:为垂直线花纹。
      b.画刷使用方法、颜色的使用同(1)。
三、绘制矩形案例程序
       要求:在自定义坐标系四个象限内以象限中心为中心,分别以窗口高度的1/4为高、窗口宽度的1/4为宽画出四个矩形。第一象限的矩形边框线型、颜色、矩形填充色均为缺省。第二象矩形限边框线型为红色实线、线宽3、矩形填充蓝色45度斜花纹。第三象限矩形边框线型为绿色虚线、线宽1、矩形填充黄色。第四象限矩形边框、填充均为蓝色。
       代码及注释如下:(若需运行代码可拷贝到OnDraw函数中)

//一、自定义坐标系
	CRect rect;//这是一个关于视图窗口数据的类,这里定义一个CRect类对象
	GetClientRect(rect);//GetClientRect得到的是相对于窗口客户区左上角的坐标。
	pDC->SetMapMode(MM_ANISOTROPIC); //选择自定义坐标系模式
	pDC->SetWindowExt(rect.Width(), rect.Height()); //设置逻辑窗口尺寸
	pDC->SetViewportExt(rect.Width(), -rect.Height()); //设置窗口物理尺寸
	pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);//设置原点
	rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);//将rect的值重置
//二、各个矩形宽、高
	int w = rect.Width() / 4, h = rect.Height() / 4;
//三、使用缺省设置在第一象限绘制矩形
	int Q1CenterX = rect.Width() / 2 / 2; //第一象限中心点坐标
	int Q1CenterY = rect.Height() / 2 / 2;
	int x1 = Q1CenterX - w / 2; //第一象限矩形左上角坐标
	int y1 = Q1CenterY + h / 2;
	int x2 = Q1CenterX + w / 2; //第一象限矩形右下角坐标
	int y2 = Q1CenterY - h / 2;
	pDC->Rectangle(x1,y1,x2,y2); //画出第一象限矩形
//四、在第二象线绘制边框线型为实线、线宽3、颜色红、矩形填充蓝色45度写花纹的矩形
	CPen redPen(PS_SOLID,3,0x0000FF); //调用CPen构造函数<另一种方法>生成红色画笔
	CPen* oldPen=pDC->SelectObject(&redPen); //将画笔选入CDC并保存缺省画笔
	CBrush blueBrush;
	blueBrush.CreateHatchBrush(HS_BDIAGONAL,0xff0000);//生成蓝色带斜纹画刷
	CBrush* oldBrush = pDC->SelectObject(&blueBrush);
	int Q2CenterX = -rect.Width() / 2 / 2; //第二象限中心点坐标
	int Q2CenterY = rect.Height() / 2 / 2;
	x1 = Q2CenterX - w / 2; //第二象限矩形左上角坐标
	y1 = Q2CenterY + h / 2;
	x2 = Q2CenterX + w / 2; //第二象限矩形右下角坐标
	y2 = Q2CenterY - h / 2;
	pDC->Rectangle(x1, y1, x2, y2); //画出第二象限矩形
	pDC->SelectObject(oldPen);//恢复缺省画笔
	pDC->SelectObject(oldBrush);//恢复缺省画刷
//五、在第三象限绘制边框线型为虚线、线宽1、颜色黄、矩形填充色为绿色的矩形
	CPen greenPen;
	greenPen.CreatePen(PS_DASH, 1, RGB(0, 255, 0)); //生成绿色画笔
	  //很多软件如“画图”都可找到颜色的RGB值,网上也可搜到
	pDC->SelectObject(&greenPen); //将绿色画笔选入CDC
	CBrush yellowBrush(0x00ffff); //生成黄色画刷
	pDC->SelectObject(&yellowBrush); //将黄色画刷选入CDC
	int Q3CenterX = -rect.Width() / 2 / 2; //第三象限中心点坐标
	int Q3CenterY = -rect.Height() / 2 / 2;
	x1 = Q3CenterX - w / 2; //第三象限矩形左上角坐标
	y1 = Q3CenterY + h / 2;
	x2 = Q3CenterX + w / 2; //第三象限矩形右下角坐标
	y2 = Q3CenterY - h / 2;
	pDC->Rectangle(x1, y1, x2, y2); //画出第三象限矩形
	pDC->SelectObject(oldPen);//恢复缺省画笔
	pDC->SelectObject(oldBrush);//恢复缺省画刷
//六、在第四象限绘制边框、填充均为蓝色的矩形
	CPen bluePen(PS_SOLID, 1, RGB(0, 0, 255));
	pDC->SelectObject(bluePen);
	blueBrush.DeleteObject(); //复用蓝色画刷前先进行清除
	blueBrush.CreateSolidBrush(0xff0000);//重定义蓝色实体画刷
    pDC->SelectObject(&blueBrush);//选入蓝色实体画刷
	int Q4CenterX = rect.Width() / 2 / 2; //第四象限中心点坐标
	int Q4CenterY = -rect.Height() / 2 / 2;
	x1 = Q4CenterX - w / 2; //第四象限矩形左上角坐标
	y1 = Q4CenterY + h / 2;
	x2 = Q4CenterX + w / 2; //第四象限矩形右下角坐标
	y2 = Q4CenterY - h / 2;
	pDC->Rectangle(x1, y1, x2, y2); //画出第四象限矩形
	pDC->SelectObject(oldPen);//恢复缺省画笔
	pDC->SelectObject(oldBrush);//恢复缺省画刷

运行结果:

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

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

相关文章

新手BUG:在声明了返回值的函数中不写返回值

本文对两个分别以int和string为返回值类型的函数进行分析&#xff0c;说明了在有返回值的函数中不写返回值会产生的问题。然后给出在编译阶段检查出这样的问题的办法。 一、背景 在软件测试环节发现&#xff0c;函数会在返回之前coredump。经过排查发现&#xff0c;在这个会…

机器人技术革新:人工智能的强力驱动

内容概要 在当今世界&#xff0c;机器人技术与人工智能的结合正如星星与大海&#xff0c;彼此辉映。随着科技的不断进步&#xff0c;人工智能不仅仅是为机器人赋予了“聪明的大脑”&#xff0c;更是推动了整个行业的快速发展。回顾机器人技术的发展历程&#xff0c;我们会发现…

外网访问 Immich 照片管理软件

Immich 是一个自托管的照片和视频备份的平台&#xff0c;它允许用户在私有服务器上存储、管理和分享他们的照片&#xff0c;视频等媒体文件。 第一步&#xff0c;本地部署安装 Immich 1&#xff0c;检查 Docker 服务状态&#xff0c;确保 Docker 正常运行。 systemctl statu…

电脑软件:推荐一款免费且实用的电脑开关机小工具

目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown&#xff0c;有需要的朋友可以下载试一下&#xff01; 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具&#xff0c;对于…

Manus在虚拟现实仿真模拟中的应用案例分享

Manus虚拟现实手套作为一种高精度的人机交互设备&#xff0c;在仿真模拟领域展现出了巨大的应用潜力。通过提供实时、准确的手指动作捕捉数据&#xff0c;Manus手套为多个行业带来了前所未有的仿真体验&#xff0c;推动了技术发展和应用创新。 技术特点 1. 高精度手指跟踪 Ma…

ensp中acl的使用

拓扑图及其要求如下 基础配置 检查此上R2配置错误&#xff0c;undo重新写 检查手写配置无误 按要求写配置 要求1完成 因为一个接口的入或者出方向上 只能调用一张acl表格&#xff0c;所以要求二照样在R1上面写 要求3

5. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验5:PWM驱动直流电机)

作者:Whappy,日期:2024.10.29,决战STM32 直流电机的控制就比较简单了,只有数据线和地线,正接正转,反接反转,为了方便,本实验采用H桥电路来控制电机的正反转,H桥电路也很简单,就是4个MOS管构成的2路推挽输出电路. 注:基本上大功率器件,单片机基本上是无法驱动的,都是要靠一部分…

Python基础知识汇总(建议收藏再观看)!

1.执行脚本的两种方式 Python a.py 直接调用Python解释器执行文件 chomd x a.py ./a.py #修改a.py文件的属性&#xff0c;为可执行&#xff0c;在用 ./ 执行a.py 文件 2、简述位、字节的关系 1bytes8bit ,2**8256,可以代表256中变化&#xff0c; 3、简述 ascii、unicode、…

Java中IO的高级操作

目录 缓冲流 缓冲字节输入流&#xff1a; 缓冲字节输出流&#xff1a; 缓冲字符输入流&#xff1a; 缓冲字符输出流&#xff1a; 转换流 转换流字符输入&#xff1a; 转换流字符输出&#xff1a; 练习案例&#xff1a; 打印流 字节打印流&#xff1a; 字符打印流&a…

Matlab高光谱遥感

原文链接&#xff1a;Matlab高光谱遥感https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247623643&idx5&sne4557ed43728f851140b100f42286988&chksmfa8da23ccdfa2b2a4d795bf4087f672faaa7082d1f52e046616ab7bf196a6eef89ea553d06b1&token1392391660&…

ssm+jsp663数学课程评价系统的设计与开发

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

openssl-ec-chn命令手册

openssl-ec命令处理EC&#xff08;Elliptic Curve&#xff0c;椭圆曲线&#xff09;密钥。使密钥可以在各种形式之间转换&#xff0c;并打印出其组件。注意&#xff1a;OpenSSL使用“SEC 1:椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;”中指定的私钥格…

(JVM)深入JAVA底层 JVM(Java 虚拟机)!带你认识JVM、程序计数器、JVM栈和方法栈还有堆内存!看看JAVA针对这些内存空间都做了什么吧!

1. 什么是JVM java 二进制字节码的运行环境&#xff0c;简称&#xff1a;java 虚拟机&#xff08;Java Virtual Machine&#xff09; 2. 好处是什么 一次编写&#xff0c;到处运行自动内存管理&#xff0c;GC垃圾回收功能数组下标越界检查多态… 3. jdk、jre、jvm 4. 学习J…

OLAP平台架构演化历程

OLAP平台架构演化历程 0 导读 随着大数据的持续发展及数字化转型的兴起&#xff0c;大数据OLAP分析需求越来越迫切&#xff0c;不论是大型互联网企业&#xff0c;还是中小型传统企业&#xff0c;都在积极探索及实践OLAP引擎选型及平台架构建设&#xff0c;大数据技术的蓬勃发展…

Kaggle入门指南(Kaggle竞赛)

文章目录 Kaggle 入门指南1. Kaggle 的功能概述1.1 竞赛1.2 数据集1.3 学习与教程1.4 社区 2. 注册与设置2.1 创建账户2.2 完善个人资料 3. 探索数据集3.1 查找数据集3.2 下载数据集示例代码&#xff1a;加载数据集 3.3 数据预处理示例代码&#xff1a;数据预处理 4. 参与竞赛4…

docker 可用镜像服务地址(2024.10.31亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因&#xff1a;镜像服务器地址不可用。 2.可用地址 编辑daemon.json&#xff1a; vi /etc/docker/daemon.json内容修改如下&#xff1a; {"registry-mirrors": ["https://…

TortoiseSVN小乌龟下载安装(Windows11)

目录 TortoiseSVN 1.14.7工具下载安装 TortoiseSVN 1.14.7 工具 系统&#xff1a;Windows 11 下载 官网&#xff1a;https://tortoisesvn.subversion.org.cn/downloads.html如图选 TortoiseSVN 1.14.7 - 64 位 下载完成 安装 打开 next&#xff0c;next Browse&#xf…

CAD图纸防泄密|哪些措施可以加密公司图纸?五个宝藏方法分享,2024必读!

在工程设计领域&#xff0c;CAD图纸作为企业的核心资产&#xff0c;其安全性至关重要。一旦图纸泄露&#xff0c;不仅可能给企业带来重大的经济损失&#xff0c;还可能损害企业的声誉和竞争力。 那么&#xff0c;怎么实现CAD图纸防泄密呢&#xff1f; 以下是五个CAD图纸防泄密…

Centos7安装最新版EMQX(v5.8.1)

引言 由于从centos停止维护&#xff0c;导致yum源不可用&#xff0c;好多方法安装都有问题&#xff0c;各种缺依赖&#xff1b;其实最简单就是换操作系统&#xff0c;Ubuntu&#xff0c;centos停止维护之后我们现在服务器基本上都是Ubuntu;而我的环境又不想再折腾&#xff0c;…

网络应用技术 实验二:交换机VLAN 应用(华为ensp)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1&#xff1a;在交换机上创建VLAN 并测试通信 2、任务 2&#xff1a;路由交换机实现VLAN 之间通信 六、实验步骤 1、完成任务 1 2、完成任务 2 一、实验简介 在交换机上配置 VLAN&#x…