MFC图形函数学习05——画椭圆函数

news/2024/11/5 5:52:29 标签: mfc

       MFC中有一个专门绘制椭圆的函数,其参数与绘制矩形参数相同,实际上所绘制的椭圆就是矩形的内切圆椭圆。
一、绘制椭圆函数
       原型:BOOL Ellipse (int x1,int y1,int x2,int y2);
       参数:椭圆内切矩形的左上角(x1,y1)、右下角(x2,y2)坐标
       返回值:绘制成功返回非零整数、绘制失败返回0
       说明:
       a. Ellipse函数是CDC类的成员函数,使用时需要CDC类对象或指针调用。
       b. 如果把椭圆内切矩形改成正方形,则绘制的图形就是圆(MFC没有专门画圆函数)。
二、填充颜色的设置
       1、绘制椭圆边框线型、宽度、颜色的设置与画直线段时的设置一样,也是通过CPen对象调用成员函数或是通过其构造函数生成画笔,再通过CDC类成员函数SelectObject选入CDC中;需要记住的是用后要恢复缺省画笔。
       2、填充颜色的设置与绘制矩形填充颜色的设置完全相同,这里就不再重复。这里介绍一下系统事先定义好的几个常用画刷,我们称其为库画刷,使用时直接选入就行,不必再进行生成。区别是选入CDC使用的成员函数不同。这几个库画刷是: 
       画刷宏名                  值         颜色            RGB值
       WHITE_ BRUSH      0       白色实心    RGB(255,255,255)
       LTGRAY_BRUSH    1        浅灰实心    RGB(192,192,192)
       GRAY_BRUSH        2        灰色实心    RGB(128,128,128)
       DKGRAY_BRUSH   3        深灰实心    RGB(64,64,64)
       BLACK_BRUSH      4        黑色实心    RGB(0,0,0)
       HOLLOW_BRUSH  5        空刷
       NULL_BRUSH        6        透明刷
       说明: HOLLOW_BRUSH、NULL_BRUSH效果相同
       3、选入库画刷的函数
      原型:virtual CGDIObject *SelectStockObject(int nIndex); //参数既是画刷宏名或值
      返回值:如果调用成功,返回被替代的CGdiObject画刷指针,不成功返回NULL
      说明:
      a.SelectStockObject函数也是CDC类的成员函数,选入画刷时也需要CDC类指针调用。
      b.尽管SelectStockObject函数的返回值类型不是CBrush*,但我们使用CBrush*进行接收并恢复缺省画刷没有问题(在调用SelectStockObject函数前用CBrush*做下强转)。
三、绘制椭圆图形案例程序
       题目:使用窗口宽度或高度较小者的80%为椭圆内切矩形的宽,20%为高绘制椭圆。椭圆边框为黑色线宽1像素,椭圆填充实心浅灰色。椭圆共绘制2个,长轴方向沿x轴1个、沿y轴1个。两个椭圆的中心点均在自定义坐标系原点。最后在坐标系原点绘制1个直径为椭圆内切矩形高度1半的圆,填充绿色。
    代码及注释如下:(运行代码可拷贝到OnDraw函数TODO: 行下面)

//一、自定义坐标系
	CRect rect;
	GetClientRect(rect);
	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);
//二、计算椭圆内切矩形型的宽w、高h
	int w = min(rect.Width(), rect.Height()) * 0.8; 
	int h = min(rect.Width(), rect.Height()) * 0.2;
//三、绘制长轴方向为x轴的椭圆
	//根据题意画笔使用缺省画笔
	//画刷使用库画刷直接选入
	CBrush* oldBrush = (CBrush*)pDC->SelectStockObject(LTGRAY_BRUSH);
	int x1 = -w / 2, y1 = h / 2; //内切矩形左上角坐标
	int x2 = w / 2, y2 = -h / 2; //右下角坐标
	pDC->Ellipse(x1,y1,x2,y2); //绘制椭圆
//绘制长轴方向为y轴的椭圆
	x1 = -h / 2, y1 = w / 2;
	x2 = h / 2, y2 = -w / 2;
	pDC->Ellipse(x1, y1, x2, y2); //绘制椭圆
	pDC->SelectObject(oldBrush);
	oldBrush->DeleteObject(); 
//绘制圆心在原点的红色圆
	CPen redPen(PS_SOLID, 1, RGB(0, 255, 0));
	CPen* oldPen = pDC->SelectObject(&redPen);
	CBrush redBrush(0x00ff00);
	oldBrush = pDC->SelectObject(&redBrush);
	x1 = -h / 4, y1 = h / 4;
	x2 = h / 4, y2 = -h / 4;
	pDC->Ellipse(x1, y1, x2, y2); //绘制圆
	pDC->SelectObject(oldBrush); //恢复缺省画刷
	pDC->SelectObject(oldPen); //恢复缺省画笔


http://www.niftyadmin.cn/n/5739015.html

相关文章

django-tidb版本说明

django-tidb 版本说明 https://github.com/pingcap/django-tidb django-python版本说明 Django 4.2 版本发行说明 | Django 文档 | Django

R语言贝叶斯:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析

原文链接:R语言贝叶斯:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247625527&idx8&snba4e50376befd94022519152609ee8d0&chksmfa8daad0cdfa23c6…

GitHub上传自己的项目

目录 一、安装Git插件 1)下载 2)安装 二、创建Gothub的创库 三、通过Git上传本地文件到Github 四、其他 1、部分指令 2、如果已经运行过git init并设置了[user],下次可以直接用 一、安装Git插件 1)下载 下载地址&#x…

如何实现视频人声分离?实用方法分享

在数字媒体技术日新月异的今天,视频处理已成为我们日常生活和工作中不可或缺的一部分。其中,视频人声分离技术凭借其独特的魅力和广泛的应用场景,逐渐走进了大众的视野。本文将深入探讨视频人声分离技术的原理、应用及其未来发展。 一、视频人…

DiskGenius工具扩容Mac OS X Apple APFS分区

DiskGenius是一款功能强大的磁盘分区工具,它支持Windows和Mac OS X系统,可以用于管理硬盘分区,包括扩容Mac OS X的Apple APFS分区。然而,直接使用DiskGenius来扩容Mac OS X的APFS分区可能存在一定的风险,因为不是专门为…

Flutter鸿蒙next中的按钮封装:自定义样式与交互

在Flutter应用开发中,按钮是用户界面中不可或缺的组件之一。它不仅用于触发事件,还可以作为视觉元素增强用户体验。Flutter提供了多种按钮组件,如ElevatedButton、TextButton、OutlinedButton等,但有时这些预制的按钮样式无法满足…

矩阵NFC碰一碰发视频源码开发技术解析,支持OEM

一、引言 在当今数字化营销的热潮中,矩阵爆店码成为了助力商家引流推广的重要工具。开发矩阵爆店码的源码涉及到多种技术的综合运用,本文将深入探讨其开发过程中的关键技术要点。 二、技术选型 (一)后端开发技术 编程语言 选择一…

电通旗下VeryStar连摘Campaign 亚太科技MVP及鼎革奖两项大奖

近日,电通CXM(客户体验管理)旗下费芮互动VeryStar开发的OmniRetail零售数字化平台及其中的OmniCRM分别摘得重磅奖项。OmniCRM在Campaign亚太2024年度亚太地区Tech MVP中当选“最有价值科技产品”,OmniRetail荣获“2024「鼎革奖」数…