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

ops/2024/10/30 20:02:50/

       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); //将绿色画笔选入CDCCBrush yellowBrush(0x00ffff); //生成黄色画刷pDC->SelectObject(&yellowBrush); //将黄色画刷选入CDCint 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.ppmy.cn/ops/129684.html

相关文章

分别用webpack和vite注册全局组件

基础组件的自动化全局注册 1. 组件全部导入后&#xff0c;批量注册 import dgDialog from "/components/dgDialog/index.vue"; import svgIcon from "/components/svgIcon/index.vue"; const allComponent { dgDialog, svgIcon }; export default {inst…

Python实现基于WebSocket的stomp协议调试助手工具

stomp协议很简单&#xff0c;但是搜遍网络竟没找到一款合适的客户端工具。大多数提供的都是客户端库的使用。可能是太简单了吧&#xff01;可是即便这样&#xff0c;假如有一可视化的工具&#xff0c;将方便的对stomp协议进行抓包调试。网上类似MQTT的客户端工具有很多&#xf…

如何从iconfont中获取字体图标并应用到微信小程序中去?

下面我们一一个微信小程序的登录界面的制作为例来说明&#xff0c;如何从iconfont中获取字体图标是如何应用到微信小程序中去的。首先我们看效果。 这里所有的图标&#xff0c;都是从iconfont中以字体的形式来加载的&#xff0c;也就是说&#xff0c;我们自始至终没有使用一张…

工具_Nginx

文章目录 location语法介绍跨域配置https配置http重定向到https配置反向代理配置负载均衡配置upstream配置负载均衡算法&#xff08;1&#xff09;rr轮询&#xff08;默认&#xff09;&#xff08;2&#xff09;wrr加权轮询&#xff08;weight&#xff09;&#xff08;3&#x…

[极客大挑战 2019]FinalSQL

首先进入题目正常思路是登录框存在sql注入&#xff0c;尝试万能密码&#xff0c;提示“你可别被我逮住了&#xff0c;臭弟弟”&#xff0c;应该是被过滤了&#xff0c;做一下FUZZ测试&#xff0c;发现过滤了空格&#xff0c;union等关键字 FUZZ字典已经上传到CSDN了 试了很长时…

没有基础,学习HCIE难吗?

首先要清楚&#xff0c;华为 HCIE-Datacom 认证并非局限于特定专业背景&#xff0c;即便对专业基础有一定要求&#xff0c;无论你有无相关学习经历或者工作经验&#xff0c;皆有机会报考并争取通过这一认证。HCIE-Datacom 考试主要由笔试和实验两部分构成&#xff0c;涉及高级路…

【Python爬虫实战】络爬虫完整指南:从TCP/IP协议到爬虫实践

网络爬虫完整指南&#xff1a;从TCP/IP协议到爬虫实践 什么是TCP/IP协议&#xff1f; TCP/IP协议&#xff08;传输控制协议/互联网协议&#xff09; 是互联网通信的核心协议套件&#xff0c;它定义了设备在互联网上如何通信的规则和方式。TCP/IP协议由多个层组成&#xff0c;其…

项目开发的架构模式与异步请求(AJAX)

一、项目开发的架构模式 1. 架构模式的分类 在项目开发中&#xff0c;架构模式通常分为以下两种类型&#xff1a; B/S架构&#xff08;浏览器/服务端&#xff09;C/S架构&#xff08;客户端/服务端&#xff09; 例如&#xff0c;QQ和微信的设计均基于C/S架构。这种架构的本…