【计算机图形学课程】一.MFC基本绘图函数使用方法
这是2016年我《计算机图形学》课程实践编程课介绍的相关知识,主要是想通过MFC C++绘图,让学生体会下图形学相关的编程及简单的图形绘制,同时非常佩服学生的想象力,他们做得真的不错。希望这篇基础文章对你有所帮助吧!尤其是有这门课程的学生或编程爱好者,如果文章存在错误或不足之处,还请海涵。
参考书籍:孔令德·《计算机图形学基础教程(Visual C++版)》
学生绘制的图形还是非常有创新的,表示很满意,哈哈哈~
一. MFC绘图基础知识 CDC类
VC++具有强大的绘图功能,虽然基于对话框的应用我推荐大家使用C# Winform程序,但是计算机图形和图像的基础知识,还是强烈推荐使用VC++ MFC实现。这有助于让你深入的理解图形变换、图像处理等知识。 在Windows平台下,GDI(Graphics Device Interface)图形设备接口被抽象为上下文CDC类(Device Context,DC)。Windows平台直接接收图形数据信息的不是显示器和打印机等硬件设备,而是CDC对象。MFC中,CDC类定义设备上下文对象的基类,封装了所需的成员函数,调用CDC类的成员函数,绘制和打印图形及文字。
CDC类派生出CClientDC类、CMetaFileDC类、CPaintDC类和CWindowDC类,请读者自行学习,同时推荐阅读原书。
MFC常用CPoint、CRect、CSize等数据类型。
(1) CPoint类:存放点坐标(x,y);
(2) CRect类:存放矩形左上顶点和右下角顶点的坐标(top、left、right、bottom),其中(top,left)为矩形的左上角点,(right,bottom)为矩形的右下角点;
(3) CSzie类:存放矩形的宽度和高度的坐标(cx,cy),其中cx为矩形的宽度,cy为矩形的高度。
MFC绘图工具类包括CGdiObject、CBitmap、CBrush、CFont、CPallette、CPen和CRgn等。常用的包括:
(1) CBitmap:封装了一个GDI位图,提供位图操作的接口;
(2) CFont:封装了GDI字体,可以选作设备上下文中的当前字体;
(3) CBrush:封装了GDI画刷,选作设备上下文的当前画刷,画刷用于填充图形内部;
(4) CPen:封装了GDI画笔,选作设备上下文的当前画笔,画笔用于绘制图形边界线;
(5) CPallette:封装了GDI调色板,提供应用程序和显示器之间的颜色接口;
(6) CGdiObject:GDI绘图工具的基类,一般不能直接使用。
二. MFC单文档编程介绍
首先创建MFC项目,选择"MFC AppWizard"工程,命名为"test01"。
然后选择"单文档"格式,其中"基于对话框"是Dialog对话框工程。
创建完工程,在工作区间主要包括:ClassView(类视图)、ResourceView(资源视图)和FileView(文件视图)。其中类视图主要包含各个类,文件视图包括源文件.cpp和头文件.h。
打开资源ResourceView视图如下所示:
MFC写代码通常在xxxView.cpp文件下,在"test01View.cpp"中找到OnDraw()函数,用于绘图:
下面将详细介绍MFC基础绘图函数。
三. MFC绘图函数及扩展
1.MFC绘图函数
(1)绘制直线
CDC::MoveTo(int x, int y)
将画笔移动到当前位置,即坐标(x, y)处,并没有画线。
CDC::LineTo(int x, int y)
画笔从当前位置绘制一条子线到(x, y)点,但不包含(x, y)点。
绘制图形如下所示,坐标(100, 150)表示距离左边100,距离顶部150。
通常可以设置绘制图形的颜色及线条属性,函数为:
CPen::CreatePen(int nPenStyle, int nWidth, COLORREF color)
其中第一个参数为画笔的风格,实现、虚线等,第二个参数为画笔粗细,第三个参数使画笔的颜色,采用RGB(255, 255, 255)赋值。
调用CPen选中画笔对象指针,即将画笔指向新画笔,同时指向指针。
运行结果如下图所示,注意定义画笔后需要选择画笔SelectObject(),才能使用。
CDC::Rectangle(int x1, int y1, int x2, int y2)
参数x1、y1表示矩形左上角坐标,参数x2、y2表示矩形右下角坐标。
运行结果如下图所示,同时定义点是CPoint,可以调用point.x和point.y获取坐标。
CBrush::CreateSolidBrush(COLORREF crColor)
参数为画刷颜色,主要用于填充图形。
CBrush::SelectObject(CBrush* pBrush)
选择画刷,填充颜色,参数pBrush为选中CBrush对象的指针。
CGdiObject::DelectObject()
把已成自由状态的画刷从系统内存中清除,此函数同删除画笔函数。
选择画刷填充如下图所示:
真实操作中,通常会在画笔和画刷使用完毕时,把已成为自由状态的画笔和画刷从系统内存中删除。
(6) 绘制椭圆函数
CDC::Ellipse(int x1, int y1, int x2, int y2)
参数x1、y1是绘制椭圆外接矩形左上角的坐标,x2、y2是外接矩形的右下角坐标。当绘制的外接矩形长和宽相同,即绘制的是圆。
输出如下图所示:
(7) 绘制文字
CDC::TextOut(int x, int y, const CString & str)
参数x、y是文本的起点坐标,参数str是CString对象,文字内容。同时可以结合Format格式控制字符串输出变量。
输出如下图所示:
2.扩展知识
第一个扩展是,绘制直线过程中,如果围绕一个圆心进行循环绘制,可以得到很好看的圆形直线。
输出如下图所示:
第二段代码涉及图形平移,就是绘制矩形图形平移操作。
输出如下所示:
四. 学生成果及创新
下面的代码是做得比较好的同学的,感觉还是不错的。
夏KH同学:
输出如下所示:
李N同学:
输出如下所示:
杨同学:
输出如下图所示:
张同学:
输出如下图所示:
郑同学:
输出如下图所示:
赵同学:
输出如下图所示:
陈同学:
输出如下图所示:
刘同学代码如下:
希望文章对你有所帮助,上课内容还需要继续探索,这篇文章主要讲述MFC绘制图形的基础知识,再结合计算机图形学的旋转和平移应用进行扩展。原来课程可以这么上,挺有意思的,同时学生的想象力真实厉害,而且也很优秀。下周专家就来了,真的很忙,但是再忙,写博客的时候自己都是最放松最享受的时候,上课也是一样。加油~
希望能与大家一起在华为云社区共同成长。原文地址:https://blog.csdn.net/Eastmount/article/details/53180524
(By:Eastmount 2021-12-16 夜于武汉)
- 点赞
- 收藏
- 关注作者
评论(0)