您好,欢迎访问三七文档
1第7章屏幕绘图及文本显示屏幕是最基本的输出设备,屏幕绘图及文本显示是应用程序最常用的功能,本章讲述VisualC++中屏幕绘图及文本显示的工作原理及其基本编程方法。首先介绍GDI与设备描述表,然后介绍CDC类、映射方式等概念,最后介绍基本的绘图函数及文本显示函数的用法。7.1GDI与设备描述表Windows操作系统是一个图形界面的操作系统,为了方便地在屏幕上和打印机上绘制或输出图形与文本,Windows系统中为用户提供了设备描述表和GDI函数来实现应用程序与物理设备间的接口。7.1.1GDI的基本概念Windows图形设备接口GDI(GraphicalDeviceInterface)是为与设备无关的图形设计的。所谓设备的无关性,就是操作系统屏蔽了硬件设备的差异,因而设备无关性能使用户编程时无需考虑特殊的硬件设置。Windows把与绘图工作相关的操作都制作成了函数,GDI提供了用户可以调用的一套用于绘图的函数集。无论基础硬件如何,同一函数都能够生成相同结果。例如,调用GDI函数中的Ellipse函数可以绘制椭圆,调用TextOut函数可以绘制文本,调用Rectangle函数可以绘制矩形等。除了这些绘图函数之外,GDI还有一套用于绘图的工具(对象),比如画刷、画笔等。GDI绘图工具的使用在7.4小节中介绍。文本被看作是图形,这种处理方式虽然在创建文本输出时增加了复杂度,但也增强了灵活性。可以让原本在文本世界非常困难的工作变得非常轻松。7.1.2设备描述环境Windows下,有多种输出设备,如各种显示器、打印机、绘图仪等。由于用来显示图形的实际物理设备的多样性,因此要求程序设计人员具有对所有图形显示设备的编程能力是不现实的。为了简化应用这些性质不同的设备的访问,实现与设备无关的绘图操作,Windows提供了一种叫做设备描述表的机制,也称为设备环境DC(DeviceContext),它是Windows应用程序与设备驱动程序和输出设备(如打印机、显示器等)之间的接口,用来作为应用程序与控制输出设备的低层之间的通道。设备描述表是一种可以在其上绘图的“逻辑画布”,它接收应用程序的绘图命令,再将其翻译为控制设备驱动程序的低层指令。程序员可以在这个虚拟的图形显示对象上进行绘图,而把这个图形最终转换为实际物理设备上图形的工作则交给系统去完成。这样,通过设备描述符表机制,程序可以独立于“真实”的硬件。设备环境DC(DeviceContext)是由GDI保存的一个数据结构,设备环境包含了输出设备的绘图特征,不同设备有不同的设备环境,在输出设备上输出的先决条件是获得该设备的设备环境。例如,为了在屏幕上显示绘图,Window程序必须有该显示器的一个DC。为了在打印机输出,还需要另一个专门为打印机创建的DC。Windows中的设备描述表分为以下4种类型。显示器型:支持显示器上的绘图操作。打印机型:支持打印机和绘图仪上的绘图操作。2内存型:支持位图上的绘制操作。信息型:支持设备数据的访问。为了方便,Windows系统初始化了一套DC的属性和对象,表7-1为显示器DC的属性及默认值,获得了该设备的DC后,程序设计人员就可以在这个默认的环境下开始绘图工作了。当然,如果程序员对预置的属性和对象不满意的话,也可以按自己的要求对它们进行设置。例如,默认的DC中预置了一支黑色画笔,所以这时用GDI的绘图函数绘制的任何线条都是黑色的。如果想使用其他颜色绘制线条的话,程序员可以用其他颜色的画笔来替换这支黑色的画笔。DC在任何时候总是必须存在着一套完整的绘图工具。这意味着,不能从DC中删除一个工具,只能用一个工具替换另一个工具。绘图过程可描述为使用GDI对象(逻辑画笔或画刷等)在设备描述表(逻辑画布)上绘制的过程。表7-1显示器DC的属性及默认值属性默认值背景色WHITE背景模式OPAQUE位图NONE画刷WHITE_BRUSH画刷起始位置(0,0)剪截域DISPLAYSURFACE颜色调色板DEFAULT_PALETTE绘图方式R2_COPYPEN字体SYSTEM_FONT字符间距0映射方式MM_TEXT画笔BLACE_PEN多边形填充方式ALTERNATE缩放模式BLACKONWHITE文本颜色BLACK试图范围(1,1)视图原点(0,0)窗口范围(1,1)窗口原点(0,0)7.2CDC类MFC的CDC类对设备描述表和GDI函数进行了全面的封装,使这两者的使用更加方便。CDC类是一个通用的类,可以从它派生出特定类型的DC子类。1、CDC类的成员函数由于DC与屏幕绘图及文本显示操作密切相关,CDC类的成员函数主要包括以下几类:初始化函数,比如为指定的设备创建设备描述符表等。设备描述符表函数,比如保存或恢复DC的状态等。3绘图及其相关函数,比如设置绘图前景颜色、背景颜色、绘图工具选择、图形绘制等。文本与字体函数,比如文本输出、字体信息的取得等。坐标与映射函数,比如设置映射方式、各种坐标的转换等。具体函数用法在7.6小节中介绍。2、几种派生的CDC类几种派生的CDC类如表7-2所示表7-2几种派生的CDC类CPaintDC是所有CDC类中最常用的一个类,它代表了应用程序窗口的客户区,它只能使用在CView类的OnDraw函数中。OnDraw函数的声明为:OnDraw(CDC*pDC);对应用程序窗口的客户区进行绘图的所有代码都必须写在这个函数中。应用程序窗口在每次创建及需要刷新时就会产生WM_PAINT消息,如用户区移动或显示,用户窗口大小改变,程序通过滚动条滚动窗口,窗口被另一个窗口覆盖的恢复,还有下拉式菜单关闭等,这些情况下就会发送WM_PAINT消息。系统接收到这个消息就会自动调用OnDraw函数。这个函数的参数pDC就是指向CPaintDC对象的指针,在OnDraw的函数体中,就可以通过这个指针来使用DC类的成员函数进行绘图操作了。例7_1在用户区显示字符串“HelloWorld”。①用MFCAppwizard创建一个名称为ex7_1的单文档应用程序框架。②在视图类中的OnDraw函数中添加语句:pDC-Textout(50,50,“HELLO”),即视图类的代码为:voidCEx7_1View::OnDraw(CDC*pDC){CEx7_1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedataherepDC-TextOut(50,50,HELLO);//输出字符串的语句}程序运行结果如图7-1所示。对于WM_PAINT消息的响应,框架代码已经做了大量的工作,已经自动处理了DC的申请与释放的问题,用户所要做的只是在OnDraw()函数内完成绘图工作即可。下面的几节中,主要是在CPaintDC中绘图。类名说明CClientDC在相应除WM_PAINT消息之外的消息处理函数中,提供窗口客户区的设备描述环境。CMetaFileDC代表Windows图元文件的设备描述环境。在创建与设备无关的并且可以回放的图像时使用这个类型的DC。CPaintDC在OnDraw()函数中使用的窗口用户区的设备描述环境。在MFC中用OnDraw()来处理WM_PAINT消息。CWindowDC提供在整个窗口内(不只是用户区)绘图的设备描述环境。4图7-1例7-1程序的运行结果图7.3映射模式映射模式是设备描述符表DC的一个重要属性,它影响到GDI绘图及文本的显示效果。7.3.1设备坐标图形或文字要在物理设备(如显示器、打印机等)上输出,就必须使用该物理设备的坐标系统,称为设备坐标。设备坐标以设备的最小分辨单位——像素为基本单位,以左上角为坐标原点,X轴向右延伸,Y轴向下延伸,如图7-2所示。图7-2设备坐标系最常用的设备坐标就是屏幕的设备坐标,这里面又包含几种具体的设备坐标系。若以整个屏幕为范围,就是“屏幕坐标系统”,像WM_MOVE消息这样不依赖于窗口的消息,必须以整个屏幕为参照物,使用的是屏幕坐标。若以整个窗口为基准,将标题栏、菜单、滚动条、窗口边框等均计算在内,这种坐标称为“窗口坐标系统”,一般情况下窗口坐标较少使用。若以窗口的用户区为范围,点(0,0)位于用户区的左上角,这种坐标称为用户区坐标,这是最常用的一种设备坐标。函数ClientToScreen()和ScreenToClient()可以将用户区坐标转换为屏幕坐标,或者将屏幕坐标转换为用户区坐标。7.3.2逻辑坐标如果直接使用设备坐标绘图,由于屏幕和打印机的分辨率不同,同样是100个像素长5的一条直线,在两种设备上的实际输出长度将不相同。假设程序员想画一条在两种设备上都是10cm长的直线,将不得不针对屏幕和打印机的分辨率分别计算它们各需要包含多少个设备像素。为了解决这个问题,在GDI绘图中使用了逻辑坐标这一概念。逻辑坐标使用的是逻辑单位,逻辑单位与设备无关,比如逻辑单位是0.lmm,则一条100个逻辑单位长的直线,不论是显示在屏幕上,还是输出到打印机上,都是10cm长。虽然最终显示或打印时仍然要使用像素点(设备坐标),但一个逻辑单位应该映射为物理设备上的多少个像素点,是由Windows自动处理的。本章后面几小节介绍的GDI绘图函数使用的都是逻辑坐标。7.3.3映射模式映像模式定义了将逻辑单位转化为设备的度量单位的方法以及设备的X方向和Y方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况。映射模式对应用程序是很重要的。Windows中定义了8种映射模式,如表7-3所示。表7-3映射模式映射模式将一个逻辑单位映射为X轴增长方向Y轴增长方向MM_TEXT1像素向右向下MM_LOMETRIC0.1毫米向右向上MM_HIMETRIC0.01毫米向右向上MM_LOENGLISH0.01英寸向右向上MM_HIENGLISH0.001英寸向右向上MM_TWIPS1/1440英寸向右向上MM_ISOTROPIC任意(X=Y)可选可选MM_ANISOTROPIC任意(X!=Y)可选可选MM_TEXT是最简单的一种映射模式,也是默认的映射模式,它使得逻辑坐标完全等价于设备坐标。其他几种映射模式下,逻辑坐标的原点也位于窗口的左上角,但对于Y轴是向下增长的。MM_ANISOTROPIC和MM_ISOTROPIC这两种映射模式通过将图形从程序员定义的逻辑坐标窗口映射到物理设备的视口以实现坐标转换。窗口是对应逻辑坐标系上程序员设定的区域,视口是对应实际输出设备上程序员设定的区域。这两种映射模式的区别是MM_ANISOTROPIC按照窗口和视口的坐标比例进行映射,而MM_ISOTROPIC将窗口中的对称图形映射到视口时仍为对称图形。在MM_ISOTROPIC映射模式下,圆总是圆的,但是在MM_ANISOTROPIC映射模式下,圆可以被拉扁成椭圆形状。1、映射模式的设置要改变DC的映射模式,可以使用CDC类的SetMapMode()函数,函数原型形为:virtualintSetMapMode(intnMapMode);参数nMapMode是新设置的映射模式,函数的返回值是DC先前的映射模式。若要取得DC当前的映射模式,可以使用CDC类的函数GetMapMode(),函数原型形为:intGetMapMode()const;6此函数的返回值是当前的映射模式。例7-2将“HelloWorld”显示在离客户区左边和上边各l英寸的地方。①用MFCAppwizard创建一个名称为ex7_2的单文档应用程序框架。②在视图类中的OnDraw函数中添加语句,添加后的代码为:voidCEx7_2View::OnDraw(CDC*pDC){CEx7_2Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedataherepDC-SetMapMode(MM_LOENGLISH);pDC-Textout(100,-100,“HelloWorld”);//输出字符串的语句}
本文标题:C++屏幕绘图
链接地址:https://www.777doc.com/doc-4285611 .html