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

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: 行下面)

cpp 复制代码
//一、自定义坐标系
	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); //恢复缺省画笔
相关推荐
Access开发易登软件3 天前
我全新开发了一套 Access 通用 Excel 导入工具,现在开源了
数据库·microsoft·excel·mfc·vba·access·access开发
sanqima6 天前
依赖TLS和模块状态的MFC类
c++·mfc·tls·module state
sanqima6 天前
MFC里的线程本地存储(TLS)与模块状态(Module State)
c++·mfc·tls·module state
Leo.yuan6 天前
Kafka+Flink拼凑,还是FineDataLink 5.0一体化?实时数据处理的两种思路
c++·mfc
bkspiderx7 天前
在 MFC 中添加自定义消息:从定义到使用的完整指南
c++·mfc·postmessage·sendmessage·mfc 中添加自定义消息·wm_app·on_message
C++ 老炮儿的技术栈10 天前
sizeof操作符
c语言·c++·人工智能·mfc·c
C++ 老炮儿的技术栈13 天前
main函数之后的调用
c语言·c++·人工智能·qt·mfc·c
学逆向的18 天前
win32消息类型
windows·网络安全·mfc·api·win32
C++ 老炮儿的技术栈1 个月前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
莫生灬灬1 个月前
灵码 LingBuilder:用中文写代码,确定性生成真实 C++ 工程(开源)
c++·开源·mfc