好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

VC++6.0入门【第五章 图形和文本输出】.doc

33页
  • 卖家[上传人]:人***
  • 文档编号:492326391
  • 上传时间:2023-11-28
  • 文档格式:DOC
  • 文档大小:1.18MB
  • / 33 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第5章 图形与文本输出第5章 图形和文本输出精讲Windows使用图形设备接口(GDI)进行图形输出和文本输出,MFC封装了GDI对象,提供了CGdiObject类和CDC类支持图形输出和文本输出,本章你将学习使用CGdiObject类和CDC类在视图中输出各种图形和文本的方法和技巧5.1图形设备接口和CDC5.1.1图形设备接口(GDI)Windows操作系统通过图形设备接口,简称GDI (Graphics Device Interface),管理Windows程序的所有图形输出,包括显示在屏幕上的窗口,屏幕保护程序的运行,文档的打印GDI处理与不同输出设备的连接,从而应用程序开发者不需要去考虑基础硬件设备之间的不同应用程序可以使用GDI创建3种类型的图形输出:矢量图形、光栅图形和文本1. 矢量图形矢量图形输出是指创建线和填充图形,包括点、直线、曲线、多边形、扇形和矩形2. 光栅图形光栅图形输出是指光栅图形函数对以位图形式存储的数据进行操作,它包括各种位图和图标的输出在屏幕上表现为对若干行和列的像素操作,在打印机上则是若干行和列的点阵输出光栅图形是直接从内存到显存的拷贝操作,所以速度快,但是对内存要求高。

      3. 文本文本输出是GDI的另一项任务输出文本时文本的输出位置的计算不是以行为单位,而是以逻辑坐标为单位计算用户可以设置文本的各种效果,如加粗、斜体、设置颜色等MFC处理图形输出是通过设备上下文CDC类和图形对象CGdiObject类来完成的5.1.2 绘图工具GDI对象CGdiObjectCGdiObject是MFC提供绘图工具的类,它的派生类包括画笔(CPen)、画刷(CBrush)、字体(CFont)、位图(CBitmap)、调色板(CPalette)、区域(CRgn)等,它们的继承关系如图5-1所示图5-1 CGdiObject类的构成各个派生类的任务是:1. 画笔(CPen)封装GDI画笔,用于绘制对象的边框以及直线和曲线默认画笔用于绘制与一个像素等宽的黑色实线2. 画刷(CBrush)封装GDI画刷画刷是用来填充一个封闭的图形对象(如矩形,圆形)的内部区域默认的画刷颜色是白色3. 字体(CFont)封装GDI字体对象,用户可以建立一种GDI字体,并使用CFont的成员函数来访问它主要影响文本输出的效果,包括文字的大小、是否加粗、是否斜体、是否加下划线等4. 位图(CBitmap)封装GDI位图,提供成员函数装载和位图操作,位图可以用于填充区域。

      5. 调色板(CPalette)封装GDI调色板,保存系统可用的色彩信息,是应用程序和彩色输出设备上下文的接口6. 区域(CRgn)封装GDI区域区域是窗口内的一块多边形或椭圆形区域CRgn用于设备上下文(通常是窗口)内的区域操作CRgn通常与CDC类中与裁剪(clipping)有关的成员函数配合使用5.1.3设备描述表(DC)设备上下文(Device Context),简称DC,是由GDI创建用来代表设备连接的数据结构DC的主要功能有:(1) 允许应用程序使用一个输出设备2) 提供窗口应用程序,设备驱动,和输出设备之间的连接3) 保存当前信息,例如在一个窗口内绘图使用的颜色,画笔的宽度、画刷的类型等等4) 保存窗口剪取区域(clipping region),限制程序输出到输出设备中窗口覆盖的区域5.1.4设备上下文类(CDC)MFC封装了DC,提供CDC类及它的子类访问GDI,如图5-2所示,各类作用介绍如下CObjectCDCCClientDCCMetaFileDCCPanitDCCWindowDC图5-2 CDC及子类1. CDC类封装了所有图形输出函数,包含了一个DC的创建和初始化,及通用GDI对象的操作,包括画简单图形(如线、矩形、椭圆)和复杂的功能(如区域、位图、剪切区域)的操作。

      CDC类的适应范围最广,不仅能支持窗口,还能支持打印机2. ClientDC类CClientDC又名客户区设备上下文,用于客户区的输出,一般在响应非窗口消息并对客户区绘图时要用到该类,例如在鼠标双击时要输出文本等3. CPaintDCCPaintDC用于响应窗口重绘消息(WM_PAINT)的绘图输出,不仅可对客户区进行操作,还可以对非客户区进行操作4. CWindowDCCWindowDC用于窗口客户区和非客户区(包括窗口边框、标题栏、控制按钮等)的绘制,除非要自己绘制窗口的边框和按钮,否则一般不用它5. CMetaFileDCCMetaFileDC专门用于图元文件的绘制图元文件记录一组GDI操作命令,可以通过这一组GDI命令重建图形输出使用CMetaFileDC时,所有的图形输出命令会自动记录到一个与CMetaFileDC相关的图元文件中5.1.5 OnDraw函数当用AppWizard创建单文档或多文档应用程序时,视图类包含成员函数OnDraw()函数,CDC指针被传递给OnDraw()函数,下面的程序清单5-1显示了在视图窗口中输出一行文本的一个简单的OnDraw()函数程序清单5-1:用于输出的OnDraw()函数void CExam5View::OnDraw(CDC* pDC){ CExam5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->TextOut(1,1,”hello world!”);}当视图窗口或窗口的一部分需要重绘时,系统会发给窗口一个WM_PAINT消息,MFC的窗口框架会将该消息映射到CWnd::OnPaint()函数,OnPaint()函数创建一个DC,并调用视图的OnDraw() 函数。

      5.1.6 WM_PAINTWM_PAINT消息是最重要的绘图消息,它要求窗口重新绘制内容产生WM_PAINT消息的场合通常有:(1) 窗口移动后及最大化,最小化后的刷新2) 被覆盖区域的刷新,如下拉菜单覆盖的区域3) 无效区域产生后的刷新,如执行滚动条操作,将一区域移动至不可见有时数据发生变化时,需要人为生成一个绘制消息,重绘窗口,可以调用几个CWnd的函数表5-1 产生绘制消息的函数函数举例说 明Invalidate(TRUE);此函数声明整个客户区无效CRect Rect(1,1,300,300)InvalidateRect(&Rect, TRUE)此函数声明选定的区域无效,这样可以减少因重绘而产生的屏幕闪烁5.1.7 获取设备上下文(DC)绘图前必须准备好设备上下文(DC),在一个MFC应用程序获得DC的常用方法有两种:一种是接受一个参数为指向CDC对象的指针,另一种是构造CClientDC对象一些消息处理函数可以通过参数接受指向CDC对象的指针,如OnDraw()函数程序清单5-2:用于输出一个黑点的OnDraw()函数void CExam5View::OnDraw(CDC* pDC){ CExam5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here //在坐标为10,10的位置上画一点,颜色为黑色 pDC->SetPixel(CPoint(10,10),RGB(0,0,0)); }也可以使用CClientDC类创建一个局部DC对象,例如,在键盘响应消息处理函数和鼠标响应消息处理函数中要进行文本输出或图形绘制时,通常要创建一个这样的对象,并使用this指针为该对象赋值。

      程序清单5-3:在鼠标点击画一红点的鼠标左键单击消息处理函数void CExam5View::OnLButtonDown(UNIT nFlags,CPoint point){// TODO: add draw code for native data hereCClientDC dc(this); //this 指针将CExam5View赋值给创建的dc对象 dc.SetPixel(point,RGB(255,0,0));CView:: OnLButtonDown( nFlags,point);}5.1.8 编程实例【例5-1】编写一个单文档MFC(EXE)程序Exam5_1,在视图类增加成员变量,追踪鼠标左键双击的最新坐标,并输出坐标信息,运行效果如图5-3所示图5-3 实例Exam5_1运行效果1. 使用AppWizard创建一个单文档MFC(EXE程序)2. 为视图类增加成员变量记录坐标并初始化(1) 选择WorkSpace的ClassView标签,右键单击CExam5_1View类在弹出的快捷菜单中选择Add Member Variable菜单项,增加CPoint类的公有成员变量m_LPoint。

      (2) 在CExam5_1View类的构造函数CExam5_1View()中,初始化变量m_LPoint为[0,0]如程序清单5-4所示程序清单5-4:CPoint类型对象引用CExam5_1View::CExam5_1View(){ // TODO: add construction code here m_LPoint.x=0; m_LPoint.y=0;}3. 在OnDraw()函数中添加代码,在第一行输出成员变量的值如程序清单5-5粗体部分所示程序清单5-5:在视图中输出整型数据的OnDraw()函数void CExam5_1View::OnDraw(CDC* pDC){ CExam5_1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data hereCString str;str.Format(“鼠标左键双击的位置是[%d,%d]”,m_LPoint.x,m_LPoint.y); pDC->TextOut(0,0,str);}4. 在视图类增加鼠标左键双击的消息映射,修改成员变量,更新视图(1) 打开ClassWizard,选择Message Map标签,Class Name列表中选择CExam5_1View,Object IDS列表中选择CExam5_1View,Messages列表中选择WM_LBUTTONDBLCLK,单击“Add Function”按钮,添加鼠标左键双击消息映射。

      2) 单击“Edit Code”按钮,添加处理代码,用当前鼠标位置Point值替换m_LPoint的值,并设置无效区域,刷新视图程序清单5-6:产生重绘消息的鼠标消息处理函数void CExam5_1View:: OnLButtonDblClk(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default m_LPoint=point; Invalidate(TRUE); CView::OnLButtonDblClk(。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.