轻松学VisualC之绘图.pptx

上传人:小飞机 文档编号:6611118 上传时间:2023-11-17 格式:PPTX 页数:21 大小:294.32KB
返回 下载 相关 举报
轻松学VisualC之绘图.pptx_第1页
第1页 / 共21页
轻松学VisualC之绘图.pptx_第2页
第2页 / 共21页
轻松学VisualC之绘图.pptx_第3页
第3页 / 共21页
轻松学VisualC之绘图.pptx_第4页
第4页 / 共21页
轻松学VisualC之绘图.pptx_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《轻松学VisualC之绘图.pptx》由会员分享,可在线阅读,更多相关《轻松学VisualC之绘图.pptx(21页珍藏版)》请在三一办公上搜索。

1、第12章 绘图,Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上。在Windows操作系统中,绝大多数图形界面的应用程序都离不开GDI。利用GDI所提供的众多函数可以方便的在屏幕、打印机及其它输出设备输出图形和文本操作。通过本章学习可以使读者对GDI绘图有一定的了解。,12.1 CDC类及其派生类,在MFC中,CDC是设备环境的基类。它封装了绘图所需要的所有成员函数和设备环境的所有功能。同时MFC还提供了几个CDC的派生类,用于具体绘图操作中,如CClientDC、CMetaFileDC、CPain

2、tDC和CWindowDC。,12.1.1 DC基类CDC,DC即设备上下文(Device Context),它定义了图形对象的参数设置以及它们的属性,还有影响输出结果的模式选择。CDC类是设备上下文环境对象的类。CDC类提供了处理显示器以及打印机等设备上下文的成员函数。而且它提供了处理与窗口客户区对应的显示上下文的成员变量。在Windows系统中,通过CDC对象的成员函数可以进行所有的绘图操作。CDC类提供的成员函数可以用于操作设备描述对象、使用绘图工具、选择图形设备界面,以及操作颜色和调色板;还可用于取得和设置绘图属性、映射方式、视图和窗口范围的操作、坐标的转换、区域的使用、剪取、画线以及

3、绘制图形和文字等操作。,12.1.2 客户区DC类CClientDC,CClientDC即客户区设备描述表,用于客户区的输出,与特定窗口关联。通过CClientDC类开发者可以访问目标窗口中客户区。这个类派生于CDC类,它在构造函数中调用GetDC()函数,在析构函数中调用ReleaseDC()函数。也就是说,当一个CClientDC对象在构造时,它内部会调用GetDC()函数,获得一个设备描述表对象;当一个CClientDC对象析构时,会自动释放这个设备描述表资源。,12.1.3 窗口DC类CWindowDC,CWindowDC也派生于CDC类,并且在构造时调用GetWindowDC()函数

4、获得相应的设备描述表对象,在析构时调用ReleaseDC()函数释放该设备描述对象所占用的资源。也就是说,我们在创建CWindowDC对象绘图时,也不需要调用GetDC()和ReleaseDC()函数。使用CWindowDC对象可以访问整个窗口区域,包括框架窗口的非客户区和客户区。该对象的构造与CClientDC相同,同样如果要构造一个与视图窗口相关的设备描述表,则可利用视类对象的指针来构造这个CWindowDC对象。,12.1.3 重绘DC类CPaintDC,CPaintDC也是CDC的派生类,当然也可以调用CDC中提供的各种方法。但是CPainDC只能用在WM_PAINT消息处理函数中,或

5、者说只有WM_PAINT消息存在于消息队列中时CPaintDC才能使用。当然,在WM_PAINT消息处理函数中要实现绘图操作也只能用CPaintDC。,12.1.4 图元文件DC类CMetaFileDC,CMetaFileDC类提供了一个面向Windows图元文件的设备环境,封装了在一个Windows图元文件中绘图的方法。图元文件是一个与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用。例如,AutoCAD的图形保存等。因为CMetaFileDC是一种特殊的DC类,所以在此我们就不做过多的介绍了。,12.2 画笔和画刷,画笔和画刷是GDI绘图中最基本的元素。

6、其中,画笔主要用来绘制线条、曲线以及勾勒形状轮廓。画刷可用于填充一个封闭图形,所以,画笔主要用来画线,而画刷可绘制和填充图形。通过本节的学习读者可以了解到画笔和画刷的基本使用过程。,12.2.1 画笔类Cpen,上一节中我们通过调用CDC类中方法画出的线条均为黑色实线,而且线宽都是一样的。这是因为设备上下文(DC)中有一个默认的黑色画笔,因此画出的线条都是一样的。如果想要画出其它样式和颜色的线条,就需要我们自己来定义一个画笔,然后将其选入设备上下文(DC)中即可。,12.2.1 画笔类Cpen,MFC提供了一个画笔类CPen来创建画笔对象。该类封装了与画笔相关的操作,它有三个构造函数,其中一个

7、原型声明如下所示。,12.2.1 画笔类Cpen,RGB宏声明以及其定义如下所示。,12.2.2 改变线型和颜色,在利用CPen类自定义画笔画线的时候,一般需要4步:(1)自定义一个CPen对象,并进行初始化。(2)利用SelectObject()函数将CPen对象选入设备上下文的时候,该函数会返回指向先前被选对象的指针。所以,这时候我们还需要定义一个额外的CPen对象指针来接收该地址。(3)执行画线操作。(4)利用SelectObject()函数把先前的CPen对象选入设备描述表中,恢复先前的状态。,12.2.3 画刷类CBrush,画刷类主要是用来填充某个区域,由于前面我们画的是线条所以没

8、法使用画刷。本小节将以画矩形框为例介绍画刷的用法,以及和画笔之间的关系。画刷类的构造函数有四个:默认画刷、简单画刷、网格画刷和位图画刷。由于默认画刷为单一的白色填充,所以我们就不做介绍了。下面就后面三种画刷做简要讲解。,使用画刷画图,上面一小节简单展示了画刷绘图的几种效果。下面我们编写一个例子程序,实现鼠标拖拽来画一个矩形图。通过这个例子来介绍画刷的具体使用。为了节省篇幅,我们仍然在Graphics项目中进行修改。我们想创建一个透明的画刷,但是CBrush类并没有提供给我们创建透明画刷的方法。如果想要实现透明画刷,得额外用到两个函数:一个是GetStockObject()、一个是CBrush类

9、中的静态成员函数CBrush:FromHandle()。,使用画刷画图,GetStockObject()函数用于检索预定义的备用笔、刷子、字体或者调色板的句柄。该函数的声明如下所示。,使用画刷画图,CBrush:FromHandle()为CBrush类中的一个静态成员函数,它的作用就是将GDI对象句柄转换为画刷对象。利用GetStockObject()获得的是GDI句柄类型,如果想选入设备描述表必须转换为CBrush画刷对象。该函数的声明如下所示。,12.3 图形的重绘和保存,大家或许已经发现,当我们调整窗口大小时,前面所画的图形会立即消失。这是因为窗口发生了重绘,在OnDraw()函数中执行

10、绘图操作会避免这种情况。如果要使我们所画的图形能够永存,我们需要对图形进行存盘,即保存操作。,12.3.1 绘制连续线条,绘制连续线条,即通过拖动鼠标画出不规则的连续线条,线条形状和鼠标的轨迹吻合。,12.3.2 线条数据结构设计,可以发现,当我们绘制完图形后,改变窗口的大小时,图形会消失。那是因为我们并没有记录下线条的轨迹,当调整窗口大小时,窗口会重绘,将之前的痕迹抹去。所以,要想发生重绘后依然保持线条的痕迹,我们必须将所有的线条保存起来,然后在OnDraw()函数中做重新绘制操作。,12.3.3 线条的保存和读取,我们在之前学习过文件的保存,利用MFC提供的串行化操作可以很方便的完成图形的保存。要保存线条首先要使CStroke变成一个可串行化的类。,12.4 小结,本章首先讲解了CDC类及其派生类的功能和具体使用情况,还剖析了CPaintDC的隐藏的一些秘密;然后我们通过例子讲解了画笔和画刷的使用;最后我们实现了图形的重绘和保存。本章的重点内容是CDC类的使用和图形的重绘,还应该学会怎样把自定义的设备选入设备描述表。难点内容是图形的重绘和保存,因为这涉及到数据结构的设计。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号