欢迎来到天天文库
浏览记录
ID:38395921
大小:343.11 KB
页数:21页
时间:2019-06-11
《轻松学VisualC之绘x》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第12章绘图Windows绘图的实质就是利用Windows提供的图形设备接口GDI(GraphicsDeviceInterface)将图形绘制在显示器上。在Windows操作系统中,绝大多数图形界面的应用程序都离不开GDI。利用GDI所提供的众多函数可以方便的在屏幕、打印机及其它输出设备输出图形和文本操作。通过本章学习可以使读者对GDI绘图有一定的了解。12.1CDC类及其派生类在MFC中,CDC是设备环境的基类。它封装了绘图所需要的所有成员函数和设备环境的所有功能。同时MFC还提供了几个CDC的派生类,用于具体绘图操作中,如CClientDC、CM
2、etaFileDC、CPaintDC和CWindowDC。12.1.1DC基类CDCDC即设备上下文(DeviceContext),它定义了图形对象的参数设置以及它们的属性,还有影响输出结果的模式选择。CDC类是设备上下文环境对象的类。CDC类提供了处理显示器以及打印机等设备上下文的成员函数。而且它提供了处理与窗口客户区对应的显示上下文的成员变量。在Windows系统中,通过CDC对象的成员函数可以进行所有的绘图操作。CDC类提供的成员函数可以用于操作设备描述对象、使用绘图工具、选择图形设备界面,以及操作颜色和调色板;还可用于取得和设置绘图属性、映射
3、方式、视图和窗口范围的操作、坐标的转换、区域的使用、剪取、画线以及绘制图形和文字等操作。12.1.2客户区DC类CClientDCCClientDC即客户区设备描述表,用于客户区的输出,与特定窗口关联。通过CClientDC类开发者可以访问目标窗口中客户区。这个类派生于CDC类,它在构造函数中调用GetDC()函数,在析构函数中调用ReleaseDC()函数。也就是说,当一个CClientDC对象在构造时,它内部会调用GetDC()函数,获得一个设备描述表对象;当一个CClientDC对象析构时,会自动释放这个设备描述表资源。12.1.3窗口DC类C
4、WindowDCCWindowDC也派生于CDC类,并且在构造时调用GetWindowDC()函数获得相应的设备描述表对象,在析构时调用ReleaseDC()函数释放该设备描述对象所占用的资源。也就是说,我们在创建CWindowDC对象绘图时,也不需要调用GetDC()和ReleaseDC()函数。使用CWindowDC对象可以访问整个窗口区域,包括框架窗口的非客户区和客户区。该对象的构造与CClientDC相同,同样如果要构造一个与视图窗口相关的设备描述表,则可利用视类对象的指针来构造这个CWindowDC对象。12.1.3重绘DC类CPaintD
5、CCPaintDC也是CDC的派生类,当然也可以调用CDC中提供的各种方法。但是CPainDC只能用在WM_PAINT消息处理函数中,或者说只有WM_PAINT消息存在于消息队列中时CPaintDC才能使用。当然,在WM_PAINT消息处理函数中要实现绘图操作也只能用CPaintDC。12.1.4图元文件DC类CMetaFileDCCMetaFileDC类提供了一个面向Windows图元文件的设备环境,封装了在一个Windows图元文件中绘图的方法。图元文件是一个与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用。
6、例如,AutoCAD的图形保存等。因为CMetaFileDC是一种特殊的DC类,所以在此我们就不做过多的介绍了。12.2画笔和画刷画笔和画刷是GDI绘图中最基本的元素。其中,画笔主要用来绘制线条、曲线以及勾勒形状轮廓。画刷可用于填充一个封闭图形,所以,画笔主要用来画线,而画刷可绘制和填充图形。通过本节的学习读者可以了解到画笔和画刷的基本使用过程。12.2.1画笔类Cpen上一节中我们通过调用CDC类中方法画出的线条均为黑色实线,而且线宽都是一样的。这是因为设备上下文(DC)中有一个默认的黑色画笔,因此画出的线条都是一样的。如果想要画出其它样式和颜色的
7、线条,就需要我们自己来定义一个画笔,然后将其选入设备上下文(DC)中即可。12.2.1画笔类CpenMFC提供了一个画笔类CPen来创建画笔对象。该类封装了与画笔相关的操作,它有三个构造函数,其中一个原型声明如下所示。12.2.1画笔类CpenRGB宏声明以及其定义如下所示。12.2.2改变线型和颜色在利用CPen类自定义画笔画线的时候,一般需要4步:(1)自定义一个CPen对象,并进行初始化。(2)利用SelectObject()函数将CPen对象选入设备上下文的时候,该函数会返回指向先前被选对象的指针。所以,这时候我们还需要定义一个额外的CPen
8、对象指针来接收该地址。(3)执行画线操作。(4)利用SelectObject()函数把先前的CPen对象选入
此文档下载收益归作者所有