




已阅读5页,还剩106页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows程序设计教程 第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 【Insert Resource】对话框 图5.18 查看位图资源 图5.19 程序sample0511的运行结果 小 结 本章主要介绍绍了Windows中绘图绘图 的一 些机制与原理,包括
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 森林碳汇评估方法-第1篇-洞察与解读
- 本土文化适配企业价值观-洞察与解读
- 2025年事业单位招聘考试综合类职业能力倾向测验真题模拟试卷:语文写作与阅读
- 2025年事业单位招聘考试综合类职业能力倾向测验真题模拟试卷(渔业)
- 2025年度随州市招募选派三支一扶高校毕业生考前自测高频考点模拟试题及答案详解(易错题)
- 2025年上海市事业单位招聘考试综合类专业知识试卷及答案
- 2025年甘肃省张掖市市直医疗卫生单位招聘专业技术人员模拟试卷及答案详解(夺冠)
- 机器人替代与效率关系-洞察与解读
- 动态封装力学分析-洞察与解读
- 河南中招备考试卷及答案
- 2025年10月“江南十校”2026届新高三第一次综合素质检测 语文试卷(含答案详解)
- 2025年甘肃省武威市凉州区清源镇选聘专业化管理的大学生村文书模拟试卷及答案详解(名校卷)
- 制氮机设备设施风险点日常检查表
- 数学教育概论张奠宙-宋乃庆课件
- GB/T 20882.2-2021淀粉糖质量要求第2部分:葡萄糖浆(粉)
- 总账会计绩效考核表
- 人工智能8神经网络课件
- 维利克面试问题汇总
- 小区监控系统改造方案
- 中西医治疗高血压课件
- 加工中心结构(课堂PPT)
评论
0/150
提交评论