第5章-Windows绘图程序设计教材课程

上传人:yuzo****123 文档编号:140893918 上传时间:2020-08-02 格式:PPT 页数:111 大小:1.25MB
返回 下载 相关 举报
第5章-Windows绘图程序设计教材课程_第1页
第1页 / 共111页
第5章-Windows绘图程序设计教材课程_第2页
第2页 / 共111页
第5章-Windows绘图程序设计教材课程_第3页
第3页 / 共111页
第5章-Windows绘图程序设计教材课程_第4页
第4页 / 共111页
第5章-Windows绘图程序设计教材课程_第5页
第5页 / 共111页
点击查看更多>>
资源描述

《第5章-Windows绘图程序设计教材课程》由会员分享,可在线阅读,更多相关《第5章-Windows绘图程序设计教材课程(111页珍藏版)》请在金锄头文库上搜索。

1、,第5章 Windows绘图程序设计,在编写Windows应用程序过程中,加载位图或者创建位图是程序员常用的方法。 只有熟练地掌握对于位图的有关操作方法,才能编写出标准且美观的应用程序。 本章主要介绍Windows绘图程序有关的知识,并对绘图所需要的类进行充分讲解。 通过本章的学习,读者可以掌握各种图形的绘制及图像在窗口中的一些操作。,为了避免上述问题,Windows提供了一个抽象的接口图形设备接口(Graphics Device Interface,GDI)。,5.2 设备上下文,设备上下文(Device Context,DC)。 设备上下文是一种包含有关某个设备(如显示器或打印机)的绘制属

2、性信息的Windows数据结构。 下面对设备上下文进行详细介绍。,5.2.1 设备上下文介绍,在Windows应用程序设计中,所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条、形状和文本的Windows API。 设备上下文允许在Windows 中进行与设备无关的绘制。 设备上下文可用于绘制到屏幕、打印机或者图元文件。,在Windows应用程序中,每个窗口都关联有设备上下文。 用户只要获取到窗口的设备上下文,就可以在窗口中绘制各种图形图像等信息。,获取窗口设备上下文的函数是GetDC(),该函数的原型如下: HDC GetDC( HWND hWnd );,图5.1 程序samp

3、le0501的运行结果,5.2.2 设备上下文类型,1显示设备上下文 2打印机设备上下文 3内存设备上下文 4信息设备上下文,5.2.3 设备上下文MFC类,在MFC中,为了方便用户绘图,提供了一个设备上下文类CDC。 CDC类封装了绘图所需要的所有成员函数,以及各种类型的Windows设备上下文的全部功能。 此外,CDC还提供了几个派生类,如图5.2所示。,1CDC类,在CDC类中存在两个成员变量,m_hDC和m_hAttribDC。 这两个成员变量都是Windows设备上下文句柄。 CDC对象使用m_hDC对其所有的成员函数作输出调用,而使用m_hAttribDC对其所有的成员函数作属性调

4、用。 CDC类的构造函数原型如下:,图5.2 设备上下文MFC类,CDC:CDC() m_hDC = NULL; m_hAttribDC = NULL; m_bPrinting = FALSE; ,CDC:CDC() if (m_hDC != NULL) :DeleteDC(Detach(); ,2CPaintDC类,在Windows应用程序中,通常在绘制图像之前调用函数BeginPaint(),然后在设备上下文中进行一系列的绘制操作,最后调用EndPaint函数结束绘制。,在MFC中,CPaintDC类完全封装了这一过程,其机制是这样的:在构造CPaintDC对象的同时,其构造函数自动调用B

5、eginPaint()函数;在销毁CPaintDC对象的同时,其析构函数自动调用EndPaint()函数。 因此整个过程可以简化如下:构造CDC对象,执行绘制操作,最终销毁CDC对象。,CPaintDC类是所有CDC类中最常用的一个类,该类代表了应用程序窗口的客户区,其只能运行在CView类中的OnDraw()函数中。,OnDraw()函数的原型如下: void CView:OnDraw(CDC* pDC) CDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); ,3CClientDC类,与CPaintDC类一样,CClientDC类所封装的设备上下文仅

6、代表一个窗口的客户区。 但与CPaintDC类不同的是,CPaintDC类的对象只能在视图类的OnDraw()函数中使用,而CClientDC类的对象可以在除了OnDraw()函数之外的任何地方使用。,图5.3 程序sample0502的运行结果,图5.4 弹出式菜单,图5.5 添加单击消息,图5.6 程序sample0503的运行结果,4CWindowDC类,CWindowDC类所封装的设备上下文表示的是整个窗口,即不仅包括其客户区,同时也包括窗口的边框及标题栏等其他非客户区对象。,其构造函数如下: CWindowDC:CWindowDC(CWnd* pWnd) ASSERT(pWnd =

7、NULL | :IsWindow(pWnd-m_hWnd); if (!Attach(:GetWindowDC(m_hWnd = pWnd-GetSafeHwnd() AfxThrowResourceException(); ,5CMetaFileDC类,在应用程序中,有时需要重复显示一些图形。 如果每次显示一次就要绘制一次,就显得太麻烦了。 如果把绘制好的图形存储在内存中,当使用时再调用出来,就可以直接打开图形了,这种图形文件叫做图元文件。,图5.7 添加消息响应函数,图5.8 程序sample0504的运行结果,5.2.4 设备上下文操作,通常,在设备上下文中可以完成如下的操作:枚举现有的

8、图形对象、选入新的图形对象、删除现存的图形对象、保存当前的图形对象以及它们的属性、恢复先前保存的图形对象以及它们的属性等。,这些操作中有些是相对的,如选入和删除图形对象等。 下面主要介绍一下图形对象的选入、删除以及设备上下文的保存、恢复等。,1对象的选入和删除,一些打印机提供固有的画笔、画刷、字体等对象,它们一般用于改善绘制速度。 如果枚举固有的画笔、画刷等,则可以使用EnumObjects()函数检查相应的属性;如果枚举固有的字体或者GDI字体,则可以调用EnumFontFamilies()函数来完成这一任务。,如果Windows应用程序发现需要替换默认的图形对象,则它将调用相应的创建函数(

9、如对于画笔用CreatePen()等)创建一个新的图形对象,这些创建函数返回标识新对象的句柄。 在使用新对象之前,它必须调用SelectObject()函数,以便用新的图形对象取代旧的图形对象。,然而,Windows应用程序还应当保存标识默认对象的句柄,因为当使用新对象完成绘制任务后,它必须再次调用SelectObject()函数,以便恢复默认的对象。 同时,还必须调用DeleteObject()函数,以便删除新的对象,从而释放资源。 需要注意的是,如果删除失败,将会导致严重的性能问题。,2设备上下文的保存和恢复,有时,用户需要改变某些设备上下文属性,然后用改变后的属性进行绘图,完毕后又恢复原

10、来的设备上下文。 要实现这一过程,只需要简单地调用SaveDC()函数即可。,SaveDC()函数在一个特殊的GDI栈上记录了当前设备上下文的图形对象,以及它们的属性等。 通常,在开始绘制且保存原始状态之前调用这个函数,为了返回原始状态,只需要简单地调用RestoreDC()函数。,5.3 GDI对象,为了方便用户在设备上下文中绘制信息,Windows提供了6个GDI对象画笔、画刷、字体、位图、调色板和区域。 在MFC中,对于这些GDI对象分别进行了封装,形成了6个对应的MFC类,如表5.1所示。,5.4 绘 图 函 数,在CDC类中,常用的绘图函数大致可以分为4种:点线函数、形状函数、填充函

11、数和位图函数。 下面对这些绘图函数分别进行介绍。,5.4.1 点线函数,点线函数是指对点、直线和弧线进行操作的函数,下面对点、直线和弧线的有关操作函数进行详细介绍。,1点,在CDC类中,调用SetPixel()函数可以绘制一个点,该函数的原型如下:,COLORREF SetPixel( int x, int y, COLORREF crColor ); COLORREF SetPixel( POINT point, COLORREF crColor );,2直线,绘制一条直线需要两个函数:MoveTo()函数和LineTo()函数。 其中,MoveTo()函数用于确定直线的起点,该函数的原型如

12、下:,CPoint MoveTo( int x, int y ); CPoint MoveTo( POINT point );,LineTo()函数用于在当前点与起点之间绘制一条直线,该函数的原型如下: BOOL LineTo( int x, int y ); BOOL LineTo( POINT point );,3弧线,与绘制直线类似,绘制弧线也需要在两个函数:Arc()函数和ArcTo()函数。 Arc()函数用于绘制弧线所在的边界矩形,该函数的原型如下:,BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4,

13、int y4 );,BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );,4线条集,在CDC类中,可以直接调用Polyline()和PolylintTo()函数绘制弧线,函数原型如下: BOOL Polyline( LPPOINT lpPoints, int nCount ); BOOL PolylineTo( const POINT* lpPoints, int nCount );,图5.9 程序sample0505的运行结果,5.4.2 形状函数,点线函数是指对矩形、椭圆、扇形和多边形进行操作的函数。 下面对这些形状函数分别进行详细

14、介绍。,1矩形,在CDC类中,调用Rectangle()函数可以绘制一个矩形,该函数的原型如下: BOOL Rectangle( int x1, int y1, int x2, int y2 ); BOOL Rectangle( LPCRECT lpRect );,2椭圆,在CDC类中,调用Ellipse()函数可以绘制一个椭圆,该函数的原型如下: BOOL Ellipse( int x1, int y1, int x2, int y2 ); BOOL Ellipse( LPCRECT lpRect );,3扇形,在CDC类中,调用Pie()函数可以绘制一个扇形,该函数的原型如下: BOOL

15、Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );,BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );,4多边形,在CDC类中,调用Polygon()函数可以绘制一个多边形,该函数的原型如下: BOOL Polygon( LPPOINT lpPoints, int nCount );,图5.10 程序sample0506的运行结果,5.4.3 填充函数,填充函数是指对指定图形的内部或是边框进行颜色填充。 在CDC类中,填充函数包括FillRect

16、()、FrameRect()、FillSolidRect()和InvertRect()。 下面对这4个函数分别进行介绍。,1FillRect()函数,在CDC类中,可以调用FillRect()函数使用指定的画刷填充一个矩形区域,该函数的原型如下: void FillRect( LPCRECT lpRect, CBrush* pBrush );,2FrameRect()函数,在CDC类中,可以调用FrameRect()函数使用指定的画刷绘制矩形的边框,该函数的原型如下: void FrameRect( LPCRECT lpRect, CBrush* pBrush );,3FillSolidRect()函数,在CDC类中,可以调用FillSolidRect()函数使用指定颜色填充矩形区域,该函数的原型如下: void FillSolidRect( LPCRECT lpRect, COLORREF c

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号