图形设备接口.doc_第1页
图形设备接口.doc_第2页
图形设备接口.doc_第3页
图形设备接口.doc_第4页
图形设备接口.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

图形设备接口学前提示Windows中负责图形输出的是图形设备接口 GDI(Graphic Device Interface)。GDI通过将应用程序与不同的输出设备特性相隔离,使Windows应用程序能够无须修改即可在Windows支持的任何图形输出设备上运行,即具有设备无关性。本章主要介绍图形设备接口的知识设备描述表,坐标系统,映射模式,绘图函数和绘图工具知识要点设备上下文坐标的映射绘制基本图形创建画笔设备上下文类为了支持GDI绘图,MFC提供了两种重要的类设备上下文类,包括 CDC及其派生类,用于设置绘图属性和绘制图形绘图对象类,封装了各种GDI绘图对象,包括画笔,画刷,字体,位图,调色板和区域等设备上下文类包括CDC类和它的派生类CClientDC,CPaintDC,CWindowDC ,CMetaFileDC。表 7.1 CDC 类的一些常用函数函数描述Arc()绘制椭圆弧7BitBlt()把位图从一个DC拷贝到另一个 DCDraw3dRect()绘制三维图形DrawDragRect()绘制用鼠标拖动的矩形DrawEdge()绘制矩形的边缘DrawIcon()绘制图标Ellipse()绘制椭圆FillRect()用给定画刷的颜色填充矩形FillRgn()用给定画刷的颜色填充区域FillSolidRect()用给定的颜色填充矩形FloodFill()用当前画刷的颜色填充区域FrameRect()绘制矩形边界FrameRgn()绘制区域边界GetBkColor()获取背景颜色GetCurrentBitmap()获取所选位图的指针GetCurrentBrush()获取所选画刷的指针GetCurrentFont()获取所选字体的指针GetCurrentPalette()获取所选调色板的指针GetCurrentPen()获取所选画笔的指针GetCurrentPosition()获取所选画笔的当前位置GetDevicesCaps()获取显示设备能力的信息GetMapMode()获取当前设置的映射模式GetPixel()获取给定象素的RGB颜色值GetPolyFillMode()获取多边形填充模式GetTextColor()获取文本的颜色GetTextExtent()获取文本的宽度和高度GetTextMetrics()获取当前字体的信息GetWindow()获取当前DC 的指针GrayString()绘制灰色文本LineTo()绘制线条MoveTo()设置当前画笔的位置Pie()绘制饼块Polygon()绘制多边形RealizePalette()将逻辑调色板映射到系统调色板Rectangle()绘制矩形RoundRect()绘制圆角矩形SelectObject()选择 GDI 绘图对象SelectPalette()选择逻辑调色板SelectStockObject()选择预定义图形对象SetBkColor()设置背景颜色SetMapMode()设置映射模式SetPixel()把象素设定为给定颜色SetTextColor()设置文本颜色StretchBlt()把位图从一个 DC 拷贝到另一个DC,根据需要扩展或压缩位图7.2 坐标的映射坐标的映射方式简单地讲就是坐标的安排方式,系统默认的映射模式为 MM_TEXT,即 X坐标向右增加,Y坐标向下增加,(0,0)在屏幕左上方,DC中的每一点就是屏幕上的一个象素,如图 7.3所示。如语句 pDC-Rectangle(CRect(0,0,300,300)表示将绘制出一个矩形,这个矩形的左上角落在屏幕的左上方,长和宽均为 300 个象素 屏幕坐标 X 坐标向右增加屏幕Y坐标向下增加 7.2.1 设置映射模式用户可以通过int CDC:SetMapMode( int nMapMode) 指定映射模式,映射模式从 X轴 和Y轴 的比例是否可变来说,可分为固定映射模式和可变比例映射模式两类(1) 固定比例映射模式,其具体值如表 7.2 所示 表 7.2 固定比例映射模式名称解释MM_HIENGLISH每 0.001英尺,X轴的正向向右,Y轴的正向向上MM_HIMETRIC每个逻辑单位对应0.01毫米,X轴的正向向右,Y轴的正向向上MM_LOENGLISH每个逻辑单位对应0.01英尺,X轴的正向向右,Y轴的正向向上MM_LOMETRIC每个逻辑单位对应0. 1毫米,X轴的正向向右,Y轴的正向向上MM_TEXT每个逻辑单位对应一个设备像素,X轴的正向向右,Y轴的正向向下MM_TWIPS每个逻辑单位对应打印机的1/20磅上述几种映射默认的原点在屏幕左上方,(2) 可变比例映射模式 表 7.3 可变比例映射模式名称解释MM_ANISOTROPIC用任意比例的坐标轴把逻辑单位映射成用户定义的单位MM_ISOTROPIC用等比例的坐标轴把逻辑单位映射成用户定义的单位7.3 绘制基本图形CDC类在它的成员函数中封装了全部Windows 图形 API ,这些成员函数包括画点的函数,画线的函数,画形状的函数,填充和翻转形状的函数,滚动屏幕的函数,绘制文本的函数,绘制位图和图表的函数7.3.1 画点画点即在指定的坐标处按给定的颜色画出像素点,点的绘制不过是改变单个像素点的颜色。在Windows中画点 ,一般只需要调用 COLORREF CDC:SetPixel(int x,int y,COLORREF crColor)就可以在指定点画上指定的颜色,同时返回原来的颜色表 7.4 画点的函数函数名参数含义SetPixel(int x,int y,COLORREF crColor)试图用指定的颜色画一个像素,返回绘制时使用的实际颜色SetPixel(POINT point,COLORREF crColor)SetPixelV(int x, int y,COLORREF crColor)SetPiXelV()与上面的含义基本相同,但不返回绘制时使用的实际颜色,因而速度更快SetPixelV(POINT point,COLORREF crColor)其中的 X,Y 为点的横坐标和纵坐标,crColor 为点的颜色值。如果函数调用成功,则返回该像素点被设置的RGB 的值。如果函数调用失败,则返回 -17.3.2 画线画线即改变屏幕上一系列像素点的颜色,画线一般要有一个起始位置。表 7.5 画线函数函数名功能参数含义MoveTo(int x,int y)开始画线,弧和多边形时,把光标移动到一个初始位置坐标(x,y)指定该初始位置LineTo(int x,int y)画一条从初始位置到另一个点的直线坐标(x,y)指定另一个点的位置Polyline(LPPOINTb lpPoints,int nCount)画一条折线lpPoints, 是指向保存折线顶点的数组指针,Count 指定折线顶点数组中的顶点数(2)PolyPolyline( const POINT *lpPoint,const DWORD *lpPolyPoints, int nCount)画多个系列线条lpPoint是指向保存折线顶点的数组指针,各条折线的顶点数保存在lpPolyPoints 所指向的数组中,nCount 则指定折线的数目PolyBezier( const POINT *lpPoints, int nCount)画贝济埃曲线lpPoints 是曲线端点和控制点所组成的数组,nCount 则指定折线的数目Arc(int X1,int Y1,int X2,int Y2,int X3,int Y3,int X4,int Y4)画一段弧(X1,Y1)为该圆弧外接矩形的左上角坐标,(X2,Y2)为该圆弧外接矩形的右下角坐标,圆弧中心与点(X3,Y3)所构成的射线与该圆弧的交点成为圆弧的起始点,但改点并不位于圆弧上,圆弧中心与点(X4,Y4)所构成的射线与 该圆弧的交点成为圆弧的终点,但改点也不位于圆弧上Rectangle(int X1,int Y1,int X2, int Y2)画一个矩形(X1,Y1)为该矩形的左上角坐标,(X2,Y2)为该矩形的右下角坐标RoundRect(int X1,int Y1,int X2, int Y2,int X3,int Y3)画一个圆角矩形(X1,Y1)为该圆弧外接矩形的左上角坐标,(X2,Y2)为该圆弧外接矩形的右下角坐标,X3指定该圆角矩形的宽度,X4指定该圆角矩形的高度Polygon(LPPOINT lpPoints,int nCount)画一个多边形lpPoints 是指向保存多边形顶点的数组指针,nCount 指定多边形顶点数组中的顶点数PolyPolygon(LPPOINT lpPoints,LPINT lpPolyCounts,int nCount)创建一个或多个多边形lpPoints 是指向保存多边形顶点的数组指针,多边形的顶点数保存在lpPolyCounts所指向的数组中,nCount 则指定多边形的边数Ellipse(int X1,int Y1,int X2,int Y2)画一个椭圆(X1,Y1)为该圆弧外接矩形的左上角坐标,(X2,Y2)为该圆弧外接矩形的右下角坐标Pie(int X1,int Y1,int X2,int Y2,int X3,int Y3,int X4,int Y4)画一个扇形(X1,Y2) 为该圆弧外接矩形的左上角坐标,(X2,Y2)为该圆弧外接矩形的右下角坐标,圆弧中心与点(X3,Y3)所构成的射线与该圆弧的交点成为圆弧的起始点,但该点并不位于圆弧上,圆弧中心与点(X4,Y4)所构成的射线与该圆弧的交点成为圆弧的终点,但该点也不位于圆弧上Draw3dRect(int x,int y,int cx,Int cy,COLORREF clrTopLeft, COLORREF clrBottomRight) 画一个三维矩形(X,Y)为三维矩形的左上角坐标,cx 指定该三维矩形的宽度,cy 指定该三维矩形的高度,clrTopLeft 指定该三维矩形的上边与左边的颜色,clrBottomRight指定该三维矩形的底边与右边的颜色Chord(int X1,int Y1,int X2, int Y2,int X3,int Y3,int X4, int Y4)画弦(X1,Y1)为该圆弧外接矩形的左上角坐标,(X2,Y2)为该圆弧外接矩形的右下角坐标,圆弧中心与点(X3,Y3)所构成的射线与该圆弧的交点成为圆弧的起始点,但改点并不位于圆弧上,圆弧中心与点(X4,Y4)所构成的射线与该圆弧的交点成为圆弧的终点,但改点也不再圆弧上。7.4 文本的设计与实现 表 7.7 与文本有关的函数 函数名功能参数含义TextOut(int x,int y,const CString &str)在一个指定的位置,输出一个字符串(x,y)为该文本的起始坐标,str 为文本内容ExtTextOut()在一个矩形区域里输出一个字符串TabbedTextOut()基于用该函数传输的一个表,在指定位置输出一个字符串,并将字符串中的任何制表符转化为空格DrawText()在指定的矩形域里绘制文本,但比TextOut()有更多的选项,如把文本居中和显示多行文本SetTextColor(COLORREF crColor)设置文本颜色crColor 指定文本的COLORREF值SetBkMode(int nBkMode)设置背景颜色nBkMode 有两个值:TRANSPARENT(此时,Windows忽略背景色),OPAQUE(此时用当前选择的颜色作为背景色SetTextCharacterExtra()设置字符间距SetTextAlign()设置文本对齐方式GetTextMetrics()获得当前所选字体的信息注意在绘制图形或者文本时,一般只需要在CView派生类的 OnDraw成员函数中加入绘制代码就可以了。OnDraw 函数会在窗口需要重画时被自动调用,传入参数 CDC *pDC 就是对应的DC环境7.5 画笔与画刷画笔与画刷是Windows 中使用最多的GDI的绘图对象,画笔的属性包括颜色,宽度,线的风格(如虚线,实线,点划线)等。画刷决定填充区域时所采用的颜色或模板,对于一个有着固定颜色的画刷来说,它的属性包括颜色以及是否采用网格和网格的类型(如水平的,垂直的,交叉的)等7.5.1创建画笔画笔用于绘制对象的边框以及绘制点,直线和曲线,默认的画笔画一条与一个象素等宽的黑色实线。在画点或画线时系统使用当前 DC中的画笔,所以在创建画笔后必须将其选入 DC 才会在绘图时产生效果要使用画笔,首先要定义一个画笔CPen pen;然后创建画笔。创建画笔的方法有如下两种1 通过 CreatePen 来创建通过调用 CPen:CreatePen(int nPenStyle,int nWidth,COLORREF crColor) 来创建。CreatePen 个参数含义如表 7.11 所示表 7.11 CreatePen 函数各参数的意义参数名含义nPenStyle指定画笔的风格nWidth线的宽度按逻辑单位取值大小。若线宽为 0,则不论在任何 映射模式下,线宽始终为一个象素crColor线的颜色,可以选16种 VGA颜色的一种。颜色的设置用一个 RGB 宏来指定RGB宏形式为 COLORREF RGB(cRed,cGreen,cBlue)其中 cRed,cGreen,cBlue 分别代表颜色的RGB 三个分量,它们的取值在 0255 之间。可以使用 RGB 组成各种颜色nPenStyle 指定画笔的风格,其具体取值如表 7.12 所示表 7.12 nPenStyle的可取值标记名含义PS_SOLID实线PS_DASH虚线,宽度必须为1PS_DOT点线,宽度必须为1PS_DASHDOT点划线,宽度必须为1PS_DASHDOTDOT双点划线,宽度必须为1PS_NULL空线,使用时什么也不会产生PS_ENDCAP_ROUND结束处为圆形PS_ENDCAP_SQUARE结束处为方形PS_INSIDEFRAME在一个封闭形状的框架内画线,若设定的颜色不能再调色板中找到且线宽大于1,Windows会使用一种混色2 使用库存对象来创建 SelectStockObject可从如表7.13 所示的库存笔中选择一个 表 7.13 SelectStockObject 的可取值库存笔含义BLACK_PEN 黑笔NULL_PEN空笔(不画线或边框)WHITE_PEN白笔3将画笔选入设备环境在使用创建的画笔绘图之前,必须把他们选入设备环境。用SelectObject()方法把新的画笔对象选入设备环境,但是与此同时,旧的那个画笔就会丢失,所以必须把它保存下来。3 删除画笔 使用完自定义的画笔后,必须把他们删除,同时也必须清楚基础层的GDI对象和释放被占用的系统资源。当CPen类被删除时,系统将自动把基础层的GDI对象删除,并且释放被占用的系统资源 DeleteObject()函数是删除基础层的GDI对象的成员函数7.5.2 创建画刷画刷是在画封闭曲线时用于填充的颜色。例如在画圆形或方形时,系统会用当前的画刷对内部进行填充。默认的画刷将封闭的图形的内部填充成全白色。画刷可利用 CBrush 对象来产生。 创建画刷可以通过函数来创建,也可以使用 SelectStockObject() 从库存画刷中选取,其具体介绍如下1 通过函数创建画刷BOOL CreateSolidBrush(COLORREF crColor),创建一个实心画刷,用一种颜色填充一个内部区域,参数 crColor 用于指定阴影线所使用的前景色BOOCreateHatchBrush(int nIndex,COLORREF crColor),创建指定颜色和网格的画刷,其参数 nIndex 可取具体值,如表 7.14 所示 。参数 crColor 用于指定阴影线所使用的前景色表 7.14 CreateHatchBrush 函数的参数 nIndex 的可取值HS_BDIAGONAL由左向右下斜45度的阴影线HS_CROSS水平和垂直的交叉线HS_DIAGCROSS45度的斜交叉线HS_FDIAGONAL由左向右上斜 45 度的阴影线HS_HORIZONTAL水平阴影线HS_VERTICAL垂直影阴线BOOL CreatePatternBrush( CBitmap *pBitmap),以一个指向 CBitmap 对象的指针为参数,创建 以 8*8 位图为模板的画刷2 使用 SelectStockObject()从库存画刷中选取库存画刷如表 7.15 所示 表 7.15 库存画刷标记名含义BLACK_BRUSH黑色画刷WHITE_BRUSH白色画刷DKGRAY_BRUSH深灰色画刷GRAY_BRUSH灰色画刷LTGRAY_BRUSH浅灰色画刷NULL_BRUSH空画刷,内部不填充 在选择绘图设备对象(GDI对象)进行绘图时,一般可按以下的步骤进行:(1) 定义一个GDI对象(如CPen,CBrush等)。然后调用相应的函数创建此GDI对象(2) 将已构造出的GDI对象利用设备环境类对象的成员函数SelectObject选入到当前设备环境中,并同时将原来的GDI对象保存起来(3) 绘图结束后,恢复当前设备环境中原来的GDI对象,即利用设备环境类对象的成员函数 SelectObject将原来的GDI对象重新选入。绘图时,还可以通过设置绘图模式进行修正,成员函数CDC:SetROP2用于设置绘图模式,高函数的原型乳如下Int SetROP2( int nDrawMode)其中,参数nDrawMode指定了新的绘图模式,它的取值如表6-6 所示绘图模式说明R2_BLACK像素为黑色R2_WHITE像素为白色R2_NOP像素无色R2_NOT像素为背景色的相反颜色R2_COPYPEN像素为画笔的颜色R2_NOTCOPYPEN像素为画笔颜色的相反颜色R2_MERGEPENNOT像素为画笔颜色和背景色的相反颜色相或的颜色R2_MASKPENNOT像素为画笔颜色和背景色的相反颜色相与的颜色R2_MERGENOTPEN像素为画笔颜色的相反颜色和背景色的相反颜色相或的颜色R2_MASKNOTPEN像素为画笔颜色的相反颜色和背景色的相反颜色相与的颜色R2_MERGEPEN像素为画笔颜色和背景色相或的颜色R2_NOTMERGEPEN像素为R2_ MERGEPEN 的相反颜色R2_MASKPEN像素为画笔颜色和背景色相与的颜色R2_NOTMASKPEN像素为R2_MASKPEN的相反颜色R2_XORPEN像素为画笔颜色和背景色异或的颜色R2_NOTXORPEN像素为R2_XORPEN 的相反颜色CBitmapWindows中通常用位图来显示图片,位图可能是简单的图形,例如按钮位图,也可能是比较大的图像。可能与创建以上设备类的对象一样创建CBitmap类的对象初始化。初始化的简单方法是用相位图的ID调用LoadBitmap()函数来装入与应用程序相联系的位图资源。 表3-16 CBitmap类中的主要成员函数成员函数功能简述CBitmap构造函数,创建Bitmap对象LoadBitmap从可执行文件中加载指定的位图资源LoadOEMBitmap加载一个预定义的Windows位图来初始化位图对象CreateBitmap用指定的宽度,高度和位模式建立所需的位图GetBitmap查看CBitmap指定的信息(调用成功返回非0值)SetBitmapBits用IpBits指定的像素数值设置位图GetBitmapBits得到位图的像素数值(1) 加载位图资源BOOL LoadBitmap(LPCTSTR lpzsRecourceName)lpzsRecourceName指向了一个包含位图资源名的字符串BOOL LoadBitmap(UINT nIDResource)/ nIDResource位图ID号 在使用CBitmap对象时,首先要创建一个CBitmap对象,然后把它选入设备环境中,在调用其函数进行处理,使用完毕后,把它从设备环境中选出并删除。在MFC中定义了一个结构来显示位图的信息typedef struct tagBITMAPint bmType; /位图类型必须设置为0int bmWidth; /位图高度int bmHeight; /位图宽度int bmWidthBytes; /位图中每一扫描行中的字节数BYTE bmPlanes; /颜色层数BYTE bmBitsPixel; /每一像素所占的位数void FAR* bmBits; /存放像素值内存块的地址;BITMAP;使用CBitmap的函数GetBitmap即可得到显示图片的代码如下所示CBitmap bitmap; /CBitmap对象 不用通过New生成一个对象/CDC 对象CDC dcMemory;/加载资源bitmap.LoadBitmap(IDB_BITMAP1); /创建内存设备环境 dcMemory.CreateCompatibleDC(pDC); /创建内存设备环境。 / CRectangle rect;/将位图资源选入设备环境中 dcMemory.SelectObject(&bitmap);/将内存设备环境复制到真正的设备环境中pDC-BitBlt(0,0,699,699,&dcMemory,0,0,SRCCOPY);/CDC 析构函数退出并清除dcMemory,位图选出/CBitmap析构函数删除位图pDC-BitBlt(int x,int y,int nWidth,int nHeight,DCD*pSrcDC,nt xSrc,int ySrc,DWORD dwRop);程序中BitBlt()函数将位图的像素从内存显示环境复制到显示器设备环境中,该函数十分有用。上述代码中各个参数含义如下(1) X: 指定绘制区域的左上角x坐标(逻辑单位)(2) Y:指定绘制区域的左上角y坐标(逻辑单位)(3) nWidth:指定绘制区域的宽度;(4) nHeight:指定绘制区域的高度;(5) pSrcDC:指向要复制位图所在的CDC对象;(6) xSrc:指定原位图要绘制区域的左上角x坐标(逻辑单位)(7) ySrc:指定原位图要绘制区域的左上角y坐标(逻辑单位)(8) dwRop:指定绘制方式,取值如下表所示; dwRop 参数的取值表Raster值说明BLACKNESS将位图转换成黑色DSTINVERT将目的DC做NOT运算(翻转目标位图)MERGECOPY将选择的画刷与位图做AND运算MERGEPAINT先将位图做NOT运算,再与目的的DC做OR运算NOTSRCCOPY将位图做NOT运算NOTSRCERASE先将位图与目的的DC做OR运算,再将其做NOT运算PATCOPY将选择的画刷贴到目的DCPATINVERT将目的的DC与选择的画刷做XOR运算PATPAINT先将位图做NOT运算,再与画刷做OR运算,最后再与目的DC做

温馨提示

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

评论

0/150

提交评论