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

news2024/11/26 2:26:56

       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);//恢复缺省画刷

运行结果:

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

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

相关文章

【网络面试篇】TCP连接建立(笔记)

目录 一、三次握手 1. 过程描述 2. 为什么是三次握手&#xff1f;不是两次、四次&#xff1f; &#xff08;1&#xff09;三次握手才可以阻止重复历史连接的初始化 &#xff08;2&#xff09;三次握手才可以同步双方的初始序列号 &#xff08;3&#xff09;三次握手才可以…

04.DDD与CQRS

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 定义职责分离DDD与CQRS的关系领域模型和查询模型特点命令场景的领域模型查询场景的查询模型 架构方案领域事件方案1&#xff1a…

树莓派全网最全安装测试(包括系统,显示器,灯,舵机灯测试)

1.下载ubuntu https://cdimage.ubuntu.com/releases/20.04.5/release/ 2.格式化和烧录镜像源 3.修改自己的wifl sd卡直接放回树莓派 4.IP地址 https://www.bilibili.com/video/BV1YD421H7zF/?buvidXU5DB1750D0CD69E8D83AEE359EB6582A7396&is_story_h5false&midMJB9z…

LabVIEW涡扇发动机加力泵测试

LabVIEW软件开发的涡扇发动机加力泵测试平台采用高度集成的硬件设备&#xff0c;实现了对涡扇发动机加力泵的全面测试和分析&#xff0c;从而确保其性能满足严格的航空标准。 项目背景 涡扇发动机是现代飞机的重要动力来源之一&#xff0c;其加力泵的性能直接影响飞机的整体动…

车载中控系统的UI自动化测试实践

本文主要介绍了如何在车载中控系统中实施UI自动化测试的过程&#xff0c;从测试环境的准备到测试用例的设计&#xff0c;再到具体实现方法及注意事项等方面进行了详细的阐述。 引言 随着汽车行业的快速发展&#xff0c;车载中控系统已成为提升驾驶体验的重要组成部分。为了保…

echarts属性之dataZoom

dataZoom-slider 滑动条型数据区域缩放组件&#xff08;dataZoomInside&#xff09; 滑动条型数据区域缩放组件提供了数据缩略图显示&#xff0c;缩放&#xff0c;刷选&#xff0c;拖拽&#xff0c;点击快速定位等数据筛选的功能。下图显示了该组件可交互部分 所有属性 data…

牛客小白月赛103(打表、二进制、几何、思维)

文章目录 牛客小白月赛103&#xff08;打表、二进制、几何、思维&#xff09;A. 小冰的正多边形B. 冰冰的电子邮箱C. 冰冰的异或&#xff08;打表、二进制&#xff09;D. 冰冰的分界线&#xff08;几何、浮点数处理&#xff09;E. 冰冰的 GCD(调和级数、思维) 据说F是假题&…

「C/C++」C++17 之 std::variant 安全的联合体(变体)

#1024程序员节&#xff5c;征文# ✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计…

Web3的去中心化社交网络:区块链技术如何改变互动方式

随着互联网技术的不断进步&#xff0c;社交网络正在经历一场深刻的变革。Web3&#xff0c;作为新一代互联网技术的代表&#xff0c;正通过区块链和去中心化理念改变着我们与他人互动的方式。传统的社交网络通常由大型公司控制&#xff0c;用户数据的集中化管理和隐私问题备受关…

代码随想录(十二)——图论

并查集 并查集主要有三个功能。 寻找根节点&#xff0c;函数&#xff1a;find(int u)&#xff0c;也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合&#xff0c;函数&#xff1a;join(int u, int v)&#xff0c;将两个节点连在同一个根节点上判断两个节点是否在…

HarmonyOS 5.0应用开发——文件读写

【高心星出品】 文章目录 文件读写文件操作创建目录删除目录或者文件扫描目录中文件 文本读写写入文本读取文本内容 文件读写文件写入边读边写 文件读写 Core File Kit&#xff08;文件基础服务&#xff09;为开发者提供一套访问和管理应用文件和用户文件的能力。帮助用户更高…

44-RK3588s调试 camera-engine-rkaiq(rkaiq_3A_server)

在RK3588s平台上调试imx415 camera sensor 过程中&#xff0c;已经识别到了camera sensor ID&#xff0c;并且可以拿到raw图和isp处理后的图像&#xff0c;但是isp处理后的图像偏绿&#xff0c;来看查看后台服务发现rkaiq_3A_server没有运行&#xff0c;然后单独运行rkaiq_3A_s…

Linux 宝塔安装(各操作系统命令合集)

由于CentOS官方已全面停止维护CentOS Linux项目&#xff0c;公告指出 CentOS 7和8在2024年6月30日停止技术服务支持&#xff0c;详情见CentOS官方公告。导致CentOS系统源已全面失效&#xff0c;比如安装宝塔等等会出现网络不可达等报错&#xff0c;需要切换源。系统源问题&…

Android 获取OAID

获取OAID 老规矩&#xff0c;直接上&#xff1a; implementation com.huawei.hms:opendevice:6.11.0.300 // 要获取华为vaid 和aaid&#xff0c;还需添加opendevice 依赖implementation(name: oaid_sdk_2.5.0, ext: aar) import android.content.Context; import android.util.…

基于微信小程序的公务员考试信息查询系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

【Android】Kotlin教程(4)

文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时&#xff0c;可以使用 field 来访问或设置…

可以在线制作的PS网页版来了!

在当今数字化的创意时代&#xff0c;设计领域不断发展与变革&#xff0c;设计师们对于工具的需求也日益多样化和高效化。随着互联网技术的飞速进步&#xff0c;一种全新的设计工具模式应运而生——在线制作的 PS 网页版。它以其独特的优势和便捷性&#xff0c;逐渐成为众多设计…

高德地图如何添加自己店铺的位置信息?

众所周知&#xff0c;创业开店时&#xff0c;地理位置的选择至关重要。一个优越的地理位置不仅能显著提升店铺的可见度&#xff0c;还能有效吸引更多潜在顾客的光顾。而且&#xff0c;为了将店铺的客流量最大化&#xff0c;商家还需在地图平台上准确标注自己的位置信息&#xf…

【黄豆颗粒数据集】黄豆识别 机器视觉 深度学习(含数据集)

一、背景意义 随着全球农业生产的现代化&#xff0c;黄豆&#xff08;大豆&#xff09;作为一种重要的经济作物&#xff0c;广泛用于食品、饲料和工业原料的生产。准确识别和分类黄豆颗粒对于农业生产的管理、质量控制和市场分析具有重要意义。然而&#xff0c;传统的人工分类方…

JavaEE-多线程上

文章目录 线程概述进程/线程多线程的作用JVM关于线程资源的规范关于Java程序的运行原理 并发与并行并发(concurrency)并行(parallellism)并发编程与并行编程 线程的调度策略分时调度模型抢占式调度模型 创建线程线程类分析入门实现线程的第一种方式实现线程的第二种方式 线程的…