图形设备接口与绘图Chap7本章内容设备环境和设备环境类GDI绘图对象及其管理映射模式CDC中的绘图操作及其特点绘制文本Windows的图形设备接口Windows图形设备接口(GDI,GraphicsDeviceInterface)是为与设备无关的图形设计的。所谓设备无关性,就是操作系统屏蔽了硬件设备的差异。因为计算机常与一系列不同的设备结合在一起,如打印机、绘图仪等输出设备以及显示设备等,因而设备无关性的图形能使用户编程时无需考虑特殊的硬件设置,这对Windows编程来说是非常重要的。Windows应用程序使用图形设备接口和Windows设备驱动程序来支持与设备无关的图形。图形设备接口(GDl)是Windows系统的重要组成部分,负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字。Windows的图形设备接口计算机输出设备和显示设备种类繁多,包括不同技术标准的显示器、打印机、绘图仪等,每类设备又包含许多不同的型号。为了适应不同的设备,Windows系统提供应用程序与具体设备分离的功能。操作系统管理并协调一系列输出设备驱动程序,将应用程序的图形输出请求转换为打印机、绘图仪、显示器或其他输出设备上的输出。GDI的设备无关性是Windows操作系统的特色之一。对于开发人员而言,所要做的工作仅仅是在系统的帮助下建立一个与某个实际输出设备的关联,以要求系统加载相应的设备驱动程序,其他的具体输出操作则由系统实现。Windows系统分担了应用程序的硬件设备适配器功能。设备描述表(DeviceContext)设备描述表是一个用来确定任何设备的GDI输出的位置和形象的属性的集合。应用程序并不能直接存取设备描述表,但是,应用程序可以使用设备描述表的句柄来间接地存取设备描述表及其属性。当程序为设备描述表要求一个句柄时,就将创建一个设备描述表。创建的设备描述表包含了它所有的属性和默认值,应用程序可以修改这些属性。应用程序对图形的操作均参照设备描述表中的属性执行。可以将设备描述表看成图形的“输出模板”。依靠这块模板,当程序员调用GDI函数输出图形或文字时,不必关心诸如背景颜色、字体等问题。设备描述表(DeviceContext)设备环境(windows保存的一个数据结构,该结构包含应用程序向设备输出时所需要的信息。)应用程序MFC设备环境类图形设备接口设备驱动程序8.1.2设备环境类设备环境类CDC的分类CClientDC:只能在窗口的用户区绘图.用户区指窗口中除去边框、标题栏、菜单栏、状态栏等的区域、通常先调用窗口的GetClientRect()来获取用户区的大小.CWindowDC:能在窗口的任意位置绘图.通常先调用GetWindowRect()来获取窗口在屏幕坐标系中的外边框坐标.CPaintDC:往往在OnPaint()函数中使用,OnPaint()函数首先构造一个CpaintDC对象,再把它的指针传给OnDraw()函数进行绘图.8.1.2设备环境类设备环境类CDC的内容当前GDI绘图对象及其管理映射方式绘图状态管理和绘图操作8.2GDI绘图对象及其管理建立设备环境调用BeginPaint()函数应用程序响应WM_PAINT消息进行图形刷新时,由OnPaint()函数调用BeginPaint()函数获取设备环境指针,并把它传递给OnDraw()函数完成绘图.调用GetDC()函数如果绘图工作不是由WM_PAINT消息驱动的则调用GetDC()函数获取设备环境.8.2.2GDI对象的分类CPenCBrushCFontCRgnCPaletteCBitmap8.2.3CPen8.2.3CPen例:HPENhpold,hpnew;hpnew=(HPEN)GetStockObject(BLACK_PEN);hpold=(HPEN)pDC-SelectObject(hpnew);pDC-MoveTo(10,10);pDC-LineTo(100,100);pDC-SelectObject(hpold);8.2.3CPen8.2.3CPen例:CPenmyPen,*oldPen;myPen.CreatePen(PS_SOLID,10,RGB(255,0,0));oldPen=(CPen*)pDC-SelectObject(&myPen);pDC-MoveTo(10,10);pDC-LineTo(100,100);pDC-SelectObject(oldPen);8.2.4CBrush8.2.4CBrush例:HBRUSHhb,oldhb;hb=(HBRUSH)GetStockObject(BLACK_BRUSH);oldhb=(HBRUSH)pDC-SelectObject(hb);pDC-Rectangle(20,20,200,200);pDC-SelectObject(oldhb);8.2.4CBrush8.2.4CBrush8.2.4CBrush例:CBrushmyBrush,*oldBrush;myBrush.CreateHatchBrush(HS_CROSS,RGB(255,0,0));oldBrush=pDC-SelectObject(&myBrush);pDC-Rectangle(20,20,200,200);pDC-SelectObject(oldBrush);8.2.5CFont8.2.5CFont中文的字体是很丰富的,目前有40多种字体但是,系统提供的字体往往还不能满足应用程序的需要.程序员可调用GreateFont()、CreatFontIndirect()、CreatPointFont()、CreatPointFontIndex()创建自定义字体.8.2.5CFont8.2.5CFont例:8.2.5CFont例:for(inti=5;i10;i++){CFontfont;font.CreateFont(-i*5,0,100,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,Arial);CFont*oldFont=pDC-SelectObject(&font);pDC-TextOut(30,50*i-200,使用CreatFont()创建字体);pDC-SelectObject(oldFont);}8.2.5CFont当调用CreatFontIndirect()函数时,必须使用LOGFONT结构来构造CFont对象来绘制字体,LOGFONT结构如下:TypedefstructtagLOGFONT{LONGlfHeight;LONGlfWidth;LONGlfEscapement;LONGlfOrientation;LONGlfWeight;BYTElfItalic;BYTElfUnderline;BYTElfStrikeOut;BYTElfCharSet;BYTElfOutPrecision;BYTElfClipPrecision;BYTElfQuality;BYTElfPitchAndFamility;BYTElfFaceName[LF_FACESIZE];}LOGFONT8.2.5CFont例:8.2.5CFont例:LOGFONTlf;lf.lfHeight=40;lf.lfWidth=20;lf.lfItalic=true;lf.lfUnderline=true;lf.lfOrientation=0;lf.lfWeight=800;lf.lfEscapement=0;lf.lfCharSet=GB2312_CHARSET;CFontfont;font.CreateFontIndirect(&lf);CFont*old=pDC-SelectObject(&font);pDC-TextOut(0,200,使用CreatFontIndirect()创建字体);pDC-SelectObject(old);8.4CDC中的绘图操作及其特点设置绘图参数设置绘图模式intSetRop2(intDrawMode);设置背景颜色VirtualCOLORREFSetBKColor(COLOREFcrColor);设置背景模式IntSetBKMode(intnBKMode);nBKModeOPAQUE(不透光):输出文本模式,默认值nBKModeTRANSPARENT(透明):绘制之前背景色不改变绘图函数8.4CDC中的绘图操作及其特点绘图函数点CPointGetCurrentPosition();CPointMoveTo(intx,inty);CPointMoveTo(POINTpoint);直线BOOLLineTo(intx,inty);BOOLLineTo(intx,inty);椭圆IntGetArcDirection();IntSetArcDirection(intnArcDirection);8.4CDC中的绘图操作及其特点绘图函数椭圆绘制椭圆弧线的函数Arc的原型如下:BOOLArc(intXl,intYl,//指定边框矩形左上角的逻辑坐标intX2,intY2,//指定边框矩形右下角的逻辑坐标intX3,intY3,//椭圆弧起始径线的确定点坐标intX4,intY4//椭圆弧终止径线的确定点坐标);x2,y2x3,y3x4,y4x1,y18.4CDC中的绘图操作及其特点绘图函数椭圆使用当前画笔绘制一个饼图,并使用当前画刷进行填充的函数Pie:该函数的原型如下:BOOLPie(intXl,intYl,//指定边框矩形左上角的逻辑坐标intX2,intY2,//指定边框矩形右下角的逻辑坐标intX3,intY3,//椭圆弧起始径线的确定点坐标intX4,intY4//椭圆弧终止径线的确定点坐标);8.4CDC中的绘图操作及其特点绘图函数椭圆画椭圆BOOLEllipse(intx1,inty1,intx2,inty2);BOOLEllipse(LPCRECTlpRect);矩形voidFillRect(LPCRECTlpRect,Cbrush*pBrush);voidFrameRect(LPCRECTlpRect,Cbrush*pBrush);BOOLRectangle(intx1,inty1,intx2,inty2);BOOLRectangle(LPCRECTlpRect);8.5绘制文本文本格式化属性属性•文本及背景颜色•对齐方式•字符间隔•文本调整CDC的方法•SetTextColor()•SetBkColor()•SetBkMode()•SetTextAlign()8.5绘制文本绘制文本函数BOOLTextOut(intx,inty,constCstrint&str);VirtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UNITnFormat);intDrawText(constCString&str,LPRECTlpRect,UNITnFormat);VirtualBOOLExtTextOut(intx,inty,UNITnOption,LPCRECTlpRect,LPCTSTRlpszString,UNITnCount,LPINTlpDxWidths);BOOLExtTextOut(intx,inty,UNITnOption,LPCRECTlpRect,constCstring&str,LPINTlpDxWidths);VirtualCsizeTabbedTextOut(intx,inty,LPCTSTRlpszString,intnCount,intnTabPosition