Windows绘图程序设计.ppt_第1页
Windows绘图程序设计.ppt_第2页
Windows绘图程序设计.ppt_第3页
Windows绘图程序设计.ppt_第4页
Windows绘图程序设计.ppt_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 Windows绘图程序设计 在编写Windows应用程序过程中,加载位图或者创建位 图是程序员常用的方法。 只有熟练地掌握对于位图的有关操作方法,才能编写出 标准且美观的应用程序。 本章主要介绍Windows绘图程序有关的知识,并对绘图 所需要的类进行充分讲解。 通过本章的学习,读者可以掌握各种图形的绘制及图像 在窗口中的一些操作。 图形设备接口 5.1 设备上下文 5.2 GDI对象 5.3 绘图函数 5.4 画笔与画刷 5.5 5.1 图形设备接口 在MS-DOS程序中,通常采用直接向视频存储区或 打印机端口输送数据的方式。 但采用这种方式需要各种显示卡或打印机驱动程 序。 为了支持这些设备,又需要编写大量不同的代码 来包含这些驱动程序。 为了避免上述问题,Windows提供了一个抽象的接口图 形设备接口(Graphics Device Interface,GDI)。 5.2 设备上下文 设备上下文(Device Context,DC)。 设备上下文是一种包含有关某个设备(如显示器或打印 机)的绘制属性信息的Windows数据结构。 下面对设备上下文进行详细介绍。 5.2.1 设备上下文介绍 在Windows应用程序设计中,所有绘制调用都通过设备上 下文对象进行,这些对象封装了用于绘制线条、形状和文本 的Windows API。 设备上下文允许在Windows 中进行与设备无关的绘制。 设备上下文可用于绘制到屏幕、打印机或者图元文件。 在Windows应用程序中,每个窗口都关联有设备上下文。 用户只要获取到窗口的设备上下文,就可以在窗口中绘 制各种图形图像等信息。 获取窗口设备上下文的函数是GetDC(),该函数的原 型如下: HDC GetDC( HWND hWnd ); 图5.1 程序sample0501的运行结果 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对其所有的成员函数作属性调用。 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对象的同时,其构造函数自动 调用BeginPaint()函数;在销毁CPaintDC对象的同时,其析 构函数自动调用EndPaint()函数。 因此整个过程可以简化如下:构造CDC对象,执行 绘制操作,最终销毁CDC对象。 CPaintDC类是所有CDC类中最常用的一个类,该类代表了 应用程序窗口的客户区,其只能运行在CView类中的 OnDraw()函数中。 OnDraw()函数的原型如下: void CView:OnDraw(CDC* pDC) CDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); 3CClientDC类 与CPaintDC类一样,CClientDC类所封装的设备上 下文仅代表一个窗口的客户区。 但与CPaintDC类不同的是,CPaintDC类的对象只 能在视图类的OnDraw()函数中使用,而CClientDC类的对象 可以在除了OnDraw()函数之外的任何地方使用。 图5.3 程序sample0502的运行结果 图5.4 弹出式菜单 图5.5 添加单击消息 图5.6 程序sample0503的运行结果 4CWindowDC类 CWindowDC类所封装的设备上下文表示的是整个窗 口,即不仅包括其客户区,同时也包括窗口的边框及标题栏 等其他非客户区对象。 其构造函数如下: CWindowDC:CWindowDC(CWnd* pWnd) ASSERT(pWnd = NULL | :IsWindow(pWnd- m_hWnd); if (!Attach(:GetWindowDC(m_hWnd = pWnd -GetSafeHwnd() AfxThrowResourceException(); 5CMetaFileDC类 在应用程序中,有时需要重复显示一些图形。 如果每次显示一次就要绘制一次,就显得太麻烦 了。 如果把绘制好的图形存储在内存中,当使用时再 调用出来,就可以直接打开图形了,这种图形文件叫做图元 文件。 图5.7 添加消息响应函数 图5.8 程序sample0504的运行结果 5.2.4 设备上下文操作 通常,在设备上下文中可以完成如下的操作:枚举 现有的图形对象、选入新的图形对象、删除现存的图形对象 、保存当前的图形对象以及它们的属性、恢复先前保存的图 形对象以及它们的属性等。 这些操作中有些是相对的,如选入和删除图形对象 等。 下面主要介绍一下图形对象的选入、删除以及设备 上下文的保存、恢复等。 1对象的选入和删除 一些打印机提供固有的画笔、画刷、字体等对象, 它们一般用于改善绘制速度。 如果枚举固有的画笔、画刷等,则可以使用 EnumObjects()函数检查相应的属性;如果枚举固有的字体 或者GDI字体,则可以调用EnumFontFamilies()函数来完成 这一任务。 如果Windows应用程序发现需要替换默认的图形对 象,则它将调用相应的创建函数(如对于画笔用 CreatePen()等)创建一个新的图形对象,这些创建函数返 回标识新对象的句柄。 在使用新对象之前,它必须调用SelectObject()函 数,以便用新的图形对象取代旧的图形对象。 然而,Windows应用程序还应当保存标识默认对象 的句柄,因为当使用新对象完成绘制任务后,它必须再次调 用SelectObject()函数,以便恢复默认的对象。 同时,还必须调用DeleteObject()函数,以便删除 新的对象,从而释放资源。 需要注意的是,如果删除失败,将会导致严重的性 能问题。 2设备上下文的保存和恢复 有时,用户需要改变某些设备上下文属性,然后用 改变后的属性进行绘图,完毕后又恢复原来的设备上下文。 要实现这一过程,只需要简单地调用SaveDC()函数 即可。 SaveDC()函数在一个特殊的GDI栈上记录了当前设 备上下文的图形对象,以及它们的属性等。 通常,在开始绘制且保存原始状态之前调用这个 函数,为了返回原始状态,只需要简单地调用RestoreDC() 函数。 5.3 GDI对象 为了方便用户在设备上下文中绘制信息,Windows 提供了6个GDI对象画笔、画刷、字体、位图、调色板和 区域。 在MFC中,对于这些GDI对象分别进行了封装,形成 了6个对应的MFC类,如表5.1所示。 5.4 绘 图 函 数 在CDC类中,常用的绘图函数大致可以分为4种: 点线函数、形状函数、填充函数和位图函数。 下面对这些绘图函数分别进行介绍。 5.4.1 点线函数 点线函数是指对点、直线和弧线进行操作的函数 ,下面对点、直线和弧线的有关操作函数进行详细介绍。 1点 在CDC类中,调用SetPixel()函数可以绘制一个点 ,该函数的原型如下: COLORREF SetPixel( int x, int y, COLORREF crColor ); COLORREF SetPixel( POINT point, COLORREF crColor ); 2直线 绘制一条直线需要两个函数:MoveTo()函数和 LineTo()函数。 其中,MoveTo()函数用于确定直线的起点,该函数 的原型如下: 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, 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 形状函数 点线函数是指对矩形、椭圆、扇形和多边形进行 操作的函数。 下面对这些形状函数分别进行详细介绍。 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 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()、 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 clr ); void FillSolidRect( int x, int y, int cx, int cy, COLORREF clr ); 4InvertRect()函数 在CDC类中,可以调用InvertRect()函数在指定矩 形区域内显示当前颜色的相反色,该函数的原型如下: void InvertRect( LPCRECT lpRect ); 图5.11 程序sample0507的运行结果 5.4.4 位图函数 常用的位图函数有PatBlt()、BitBlt()和 StretchBlt()。 下面对这3种函数分别进行详细介绍。 1PatBlt()函数 在CDC类中,调用PatBlt()函数可以使用光栅操作 码在指定的矩形区域内创建一个位图模式,该函数的原型如 下: BOOL PatBlt( int x, int y, int nWidth, int nHeight, DWORD dwRop ); 2BitBlt()函数 在CDC类中,调用BitBlt()函数可以从指定设备环 境中复制一个位图,该函数的原型如下: BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ); 3StretchBlt()函数 在CDC类中,调用BitBlt()函数可以从指定设备环 境中复制一个位图,并对位图进行缩放操作,以适应目标区 域。 该函数的原型如下: BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop ); 图5.12 【Insert Resource】对话框 图5.13 查看位图资源 图5.14 程序sample0508的运程结果 5.5 画笔与画刷 在Windos程序设计中,需要经常使用画笔(Pen) 和画刷(Brush)。 一般情况下,画笔用于勾勒出图形的轮廓,画刷 用于填充图形的颜色。 下面对画笔与画刷的具体知识进行详细讲解。 5.5.1 使用库存画笔与画刷 在Windows中,提供了库存对象。 库存对象是由操作系统维护的用于绘制屏幕的常用 对象,如画笔与画刷。 其中,库存画笔如表5.4所示。 库存画刷如表5.5所示。 图5.15 程序sample0509的运行结果 5.5.2 自定义画笔 在Windows中,可以自定义画笔。 这时,需要用到MFC中的CPen类。 在CPen类中,调用CPen()、CreatePen()或 CreatePenIndirect()函数可以创建画笔。 1CPen()函数 CPen类的构造函数原型如下: CPen(); CPen( int nPenStyle, int nWidth, COLORREF crColor ); 2CreatePen()函数 CreatePen()函数的原型如下: BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor ); 3CreatePenIndirect()函数 CreatePenIndirect()函数的原型如下: BOOL CreatePenIndirect( LPLOGPEN lpLogPen ); 图5.16 程序sample0510的运行结果 5.5.3 自定义画刷 在Windows中,也可以自定义画刷。 在CDC类中,可以调用CBrush类中的CBrush()、 CreateSolidBrush()、CreateHatchBrush()、 CreatePatternBrush()和CreateBrushIndirect()等函数创 建自定义画刷。 下面对这几个函数分别进行介绍。 1CBrush()函数 CBrush类的构造函数原型如下: CBrush(); CBrush( COLORREF crColor ); CBrush( int nIndex, COLORREF crColor ); 2CreateSolidBrush()函数 CreateSolidBrush()函数用于创建一支具有指定 颜色的实心画刷。 该函数的原型如下: BOOL CreateSolidBrush( COLORREF crColor ); 3CreateHatchBrush()函数 CreateHatchBrush()函数可以创建一个具有指定 阴影的画刷。 该函数的原型如下: BOOL CreateHatchBrush( int nIndex, COLORREF crColor ); 4CreatePatternBrush()函数 CreatePatternBrush()函数可以创建一个具有指 定位图模式的逻辑画刷。 其中,位图不能是DIB类型的位图,DIB位图是由 CreateDIBSection()函数创建的。 该函数的原型如下: BOOL CreatePatternBrush( CBitmap* pBitmap ); 5CreateBrushIndirect()函数 CreateBrushIndirect()函数可以创建具有指定风 格、颜色和模式的逻辑画刷。 该函数的原型如下: BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush ); 图5.17 【Ins

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论