ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:137.14KB ,
资源ID:6532293      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6532293.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(GDI编程.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

GDI编程.docx

1、GDI编程GDI编程一、GDI相关概念1、GDI(GraphicsDevice Interfase):图形设备接口,是一个应用程序与输出设备之间的中介。它提供了一套函数库,这些函数在不同的输出设备上输出图形和文字。一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。2、DC (Device Context):设备描述表(设备上下文),是一种Windows数据结构,包括了如线的宽度和颜色、刷子的样式和颜色、字体、剪裁区域等信息。所有的绘制操作通过一个设备描述表进行,绘制线条、形状和文本的Windows API 函数都与DC有关。设备可以是显示器

2、,打印机等。Win32下获取DC的API函数有:HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint):特定用于WM_PAINT消息HDC GetDC(HWND hWnd):用于获得hWnd参数所指定窗口的客户区域的HDC。HDC GetWindowDC(HWND hWnd):返回hWnd参数所指定的窗口的HDC,包括非客户区,如标题栏、菜单、滚动条,以及边框等。hWnd为NULL时,获取整个屏幕的HDC。3、GDI对象:DC定义了一组GDI对象,包括画笔,画刷,字体,位图,调色板,剪裁区域,路径层(Path)。他们有MFC和Win32两套实现版本,其

3、对应关系如下:要使用这些对象,可以使用Win32函数SelectObject来将其选入DC中:HGDIOBJ SelectObject( HDC hdc, /设备上下文句柄 HGDIOBJ hgdiobj /GDI对象句柄);当然,使用之前,这些对象必须存在,可以通过如下Win32函数来创建这些对象:或者,通过Win32函数HGDIOBJ GetStockObject(int fnObject)来获取系统预先定义好的如下备用对象:fnObject参数 含义二、设备描述表DC在MFC中的实现MFC提供了CDC类作为设备描述表类的基类,它封装了Windows的HDC设备描述表对象和相关函数。CDC

4、类包含了各种类型的Windows设备描述表的全部功能,封装了所有的Win32 GDI 函数和设备描述表相关的SDK函数。在MFC下,使用CDC的成员函数来完成所有的窗口绘制工作。CDC类有两个成员变量:m_hDC,m_hAttribDC,它们都是Windows设备描述表句柄。CDC的成员函数作输出操作时,使用m_Hdc;要获取设备描述表的属性时,使用m_hAttribDC。在创建一个CDC类实例时,缺省的m_hDC等于m_hAttribDC。CDC在封装Win32函数SelectObject(HDC hdc,HGDIOBJECT hgdiobject)时,采用了重载技术,即它针对不同的GDI对

5、象,提供了如下名同而参数不同的成员函数:SelectObject(CPen *pen) /用于选入笔SelectObject(CBitmap* pBitmap) /用于选入位图SelectObject(CRgn *pRgn) /用于选入剪裁区域SelectObject(CBrush *pBrush) /用于选入刷子SelectObject(CFont *pFont) /用于选入字体SelectPalette(CPalette *pPalette,BOOL bForceBackground ) /选入调色板到DCRealizePalletter() /实现逻辑调色板到物理调色板的映射直接使用CD

6、C的例子是内存设备上下文,例如:CDC dcMem.CreateCompatibleDC(&dc); /创建设备描述表CDC pbmOld = dcMem.SelectObject(&m_bmBall); /更改设备描述表属性/作一些绘制操作dcMem.SelectObject(pbmOld); /恢复设备描述表的属性dcMem.DeleteDC(); /可以不调用,而让析构函数去删除设备描述表从CDC 派生出四个功能更具体的DC类。继承层次如下图所示:下面分别讨论这四种设备描述表。 CCientDC:代表窗口客户区的设备描述表。其构造函数CClientDC(CWnd *pWin)通过:Get

7、DC获取指定窗口的客户区的设备描述表HDC,并且使用成员函数Attach把它和CClientDC对象捆绑在一起;其析构函数使用成员函数Detach把设备描述表句柄HDC分离出来,并调用:ReleaseDC释放设备描述表HDC。 CPaintDC:仅仅用于响应WM_PAINT消息时绘制窗口,因为它的构造函数调用了:BeginPaint获取设备描述表HDC,并且使用成员函数Attach把它和CPaintDC对象捆绑在一起;析构函数使用成员函数Detach把设备描述表句柄HDC分离出来,并调用:EndPaint释放设备描述表HDC,而:BeginPaint和:EndPaint仅仅在响应WM_PAIN

8、T时使用。例如,MFC中CView对WM_PAINT消息的实现方法如下:void CView:OnPaint()CPaintDC dc(this);OnPrepareDC(&dc);OnDraw(&dc); CMetaFileDC:用于生成元文件。 CWindowDC:代表整个窗口区(包括非客户区)的设备描述表。其构造函数CWindowDC(CWnd *pWin)通过:GetWindowDC获取指定窗口的客户区的设备描述表HDC,并使用Attach把它和CWindowDC对象捆绑在一起;其析构函数使用Detach把设备描述表HDC分离出来,调用:ReleaseDC释放设备描述表HDC。三、Wi

9、n32环境下绘图的基本过程 获取或者创建设备描述表; 必要的话,改变设备描述表的属性; 使用设备描述表完成绘制操作; 释放或删除设备描述表。第一种绘图方式是对WM_PAINT消息的处理void CAaView:OnPaint() CPaintDC dc(this); / 得到绘图DC dc.TextOut(100,100,Hello World); 或者void CAaView:OnDraw(CDC *pDC)pDC-TextOut(100,100,Hello World);上面的程序可以在窗口的100,100位置处,打印Hello World字符串。那么什么时候会产生WM_PAINT消息呢?

10、由于Windows是一个多任务环境,某个应用程序的窗口上面可能被对话框或窗口覆盖,当撤消这些对话框或窗口时,这个应用程序窗口中就有一个空洞,这个空洞就是一块无效的用户区域。为重新显示无效用户区域,Windows发送WM_PAINT消息实现。要求Windows发送WM_PAINT的情况有:改变窗口大小,覆盖用户区的菜单或对话框关闭,使用UpdateWindow和ScrollWindow函数等。Windows发送WM_PAINT消息时,把它放到应用程序队列的最后,使得其它的输入能够先于WM_PAINT消息被处理。GetMessage函数也得到队列中WM_PAINT消息之后的其它消息,即只有有没有其

11、它消息的情况下,才从队列中取出WM_PAINT消息进行处理。这样做是为了让应用程序首先完成影响窗口显示结果的其它操作,不致因为频繁地执行输出操作而引起显示器的闪烁。Windows把WM_PAINT消息放在队列最后就是这个原因。Windows并非WM_PAINT消息的唯一来源,使用InvalidateRect或InvalidateRgn函数也可以产生绘图窗口的WM_PAINT消息。这两个函数把用户区全部或部分标记成无效用户区而要求重新显示。下面的函数调用是把整个用户区标记成无效:InvalidateRect(hWnd, NULL, TRUE);上面代码把hWnd句柄参数指定的窗口用户区标记成无效

12、。作为矩形结构的NULL参数指定整个用户区,TRUE参数表示擦除背景。第二种绘图的方式是在非OnDraw / OnPaint中绘图void CAaView:OnLButtonDown(UINT nFlags, CPoint point) CClientDC dc(this);dc.Ellipse(point.x-50, point.y-50, point.x+50, point.y+50);这段程序实现了:以鼠标的当前位置为圆心,画一个半径为50的圆。基本的画线函数有以下几种CDC:MoveTo( int x, int y ); 改变当前点的位置 CDC:LineTo( int x, int

13、y ); 画一条由当前点到参数指定点的线 CDC:BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 画弧线 CDC:BOOL Polyline( LPPOINT lpPoints, int nCount ); 将多条线依次序连接基本的作图函数有以下几种: CDC:BOOL Rectangle( LPCRECT lpRect ); 矩形 CDC:RoundRect( LPCRECT lpRect, POINT point ); 圆角矩形 CDC:Draw3dRect( int x, int y, int cx, int cy, COL

14、ORREF clrTopLeft, COLORREF clrBottomRight ); 3D边框 CDC:Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 扇形 CDC:Ellipse( LPCRECT lpRect ); 椭圆形 CDC:Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); CDC:Polygon( LPPOINT lpPoints, int nCount ); 多边形对于矩形,圆形或类似的封闭曲线,系统会使用画笔绘制边缘,使用刷子填充内部。如果你不希望填充或是画出边缘,

15、你可以选入空(NULL_PEN)笔或空(NULL_BRUSH)刷子。多边形和剪贴区域CreateRectRgn 由矩形创建一个多边形 CreateEllipticRgn 由椭圆创建一个多边形 CreatePolygonRgn 创建一个有多个点围成的多边形 PtInRegion 某点是否在内部 CombineRgn 两个多边形相并 EqualRgn 两个多边形是否相等基本的绘图函数CDC类中提供各种各样的输出操作,从画线到写字应有尽有。为了画线、矩形、圆、扇形和写字,可相应地调用一些函数。这些函数使用已选择的画笔和画刷,来画出边框,并填写图形内部区域,以及使用已选择的字体写字。 画点函数SetP

16、ixelCOLORREF CDC:SetPixel(int x,int y,COLORREF cclrref);该函数把x和y指定的点置为clrref指定的颜色。 画线函数LineTo与移动函数MoveToLineTo函数用来画线,并且通常与MoveTo函数配合使用,如画一条从点(10,70)到点(250,100)的线:MoveTo(10,70);LineTo(250,100); 画矩形函数RectangleRectangle函数用来画矩形。它使用已选择的画笔画出边框,使用已选择的刷子填满矩形内部。下面的例子画一个左上角位于点(10,20),右下角位于点(40,100)的矩形:Rectangl

17、e(10,20,40,100); 画圆或椭圆函数EllipseEllipse函数用来画圆或椭圆。它使用已选择的笔画框,使用已选择的刷填满圆或椭圆的内部。下面的例子画一个用点(10,20)和点(40,100)构成矩形框中的椭圆:Ellipse(10,20,40,100); 画圆弧函数ArcArc函数用来画一段弧,这段弧由包围它的矩形和弧的开始点和结束点共同定义。下面的例子在点(10,90)和点(360,120)所指定的矩形中画一段弧,它的起点和终点分别是点(15,90)和点(360,90):Arc(10,90,360,120,15,90,360,110);弧的起点坐标和终点坐标精确地位于弧上。

18、画扇形函数PiePie函数用来画扇形。扇形由一段弧和两条从弧焦点到弧端点的半径组成。Pie函数使用已选择的笔画框,使已选择的刷填满扇形内部。下面的例子画一个用点(310,30)和点(360,80)构成的矩形围成的扇形。其起点和终点分别为点(360,30)和点(360,80):Pie(310,30,360,80,310,30,360,80);弧的起点和终点不必精确地位于弧线上。四、GDI对象前面的程序只能画基本的图形,我们不能改变线条的颜色,线条的大小,不能填充颜色,也不能改变字体,显示一张位图等。要实现这些功能,我们就要使用GDI对象。这里,需强调一下:GDI对象要选入Windows 设备描述

19、表后才能使用;用毕,要恢复设备描述表的原GDI对象,并删除该GDI对象。一般按如下步骤使用GDI对象:a、先创建或得到一个GDI对象b、然后把它选入设备描述表c、绘图d、恢复设备描述表原来的GDI对象并删除刚新创建的GDI对象。MFC GDI对象MFC用一些类封装了Windows GDI对象和相关函数,层次结构如图所示:(1)画笔画笔决定了线条的颜色、宽度和线型(实线、点线或点划线等)。Windows使用当前在设备描述表中已选择的画笔来画线。程序中可以选择Windows的予定义画笔,也可以选择自定义的画笔。预定义画笔有三种:BLACK_PEN(黑色笔) 、WHITE_PEN(白色笔)和NULL

20、_PEN(空笔),这些都在windows.h中已经定义好了,程序员可使用GetStockObject函数来选择其中的一种,系统缺省的画笔为黑色笔。Windows.h包含了HPEN的数据类型定义,使用该类型可以定义画笔句柄的变量。仅靠系统提供的预定义画笔远远不能满足需求,应用程序可根据实际需要创建一种自定义的逻辑画笔。其步骤一般为:首先用CreatePen或CreatePenIndirect函数建立一支画笔,再调用SelectObject函数将其选入设备描述表,此后就可使用该画笔在选定的设备描述表中进行绘图操作。任何时候某一设备描述表只能有一支画笔被选入作为当前画笔,当一支画笔被选入时,原先已选

21、入的画笔便不再有效。完成绘图操作后,可以通过调用DeleteObject来释放已建立的画笔。* 函数CreatePen()语法:HPEN CreatePen(int fnPenStyle,int nWidth,COLORREF clrref);说明:该函数创建一个逻辑画笔。其中fnPenStyle参数指定画笔的线型,该参数可取由windows.h定义的七个标识符之一,其含义为:PS_SOLID 实线PS_DASH 虚线PS_DOT 点线PS_DASHDOT 夹一点虚线PS_DASHDOTDOT 夹二点虚线PS_NULL 无PS_INSIDEFRAME 线画在所有构件框架内nWidth参数是用逻

22、辑单位表示的画笔的宽度;clrref参数是一个COLORREF类型的颜色值,指定画笔的颜色,可用宏指令RGB构造这个值,如:clrref=RGB(byRed,byGreen,byBlue);在使用CreatPen函数时,要检查其返回值,确保它是一个有效的句柄。下面给出一段程序,说明建立、选择和释放画笔的一般方法,假定程序要用一支宽度为3的黑色作图,则程序如下:CPen *p_Pen;CDC dc;p_Pen-CreatePen(PS_SOLD,3,RGB(0,0,0);if(p_Pen)dc.SelectObject(p_Pen);/ /这里进行绘图操作Delete p_Pen; /删除hPe

23、n画笔,释放空间* 函数CreatePenIndirect()语法:HPEN CreatePenIndirect(LOGPEN FAR* lpLogPen);说明:该函数用lpLogPen所指的LOGPEN结构中的信息创建一个逻辑画笔。LOGPEN的结构如下:typedef struct tagLOGPEN(WORD lopnStyle;POINT lopnWidth;COLORREF lopnColor;) LOGPEN;其中lopnStyle指定画笔线型,该参数可取下列值之一:PS_SOLID 0PS_DASH 1PS_DOT 2PS_DASHDOT 3PS_DASHDOTDOT 4PS_

24、NULL 5PS_INSIDEFRAME 6nWidth参数是用逻辑单位表示的画笔的宽度clrref参数是一个COLORREF类型的颜色值,指定画笔的颜色,可用宏指令RGB构造这个值。(2)刷子当我们在绘制一些区域图形时,其内部往往需要以某种图案进行填充,这就需要选定刷子作为绘图工具。Windows系统不仅为用户提供了预定义刷子,而且还允许应用程序自定义刷子。Windows系统中预定义的刷子有如下七种:BLACK_BRUSH 黑色刷子DKGRAY_BRUSH 深灰色刷子GRAY_BRUSH 灰色刷子HOLLOW_BRUSH 中空刷子,画边界而不填充LTGRAY_BRUSH 浅灰色刷子NULL_

25、BRUSH 空刷子WHITE_BRUSH 白色刷子应用程序可以调用GetStockObject函数选用其中一个,系统缺省的刷子是白色刷子。Window.h包含了HBRUSH数据类型的定义,使用该类型就可定义刷子句柄的变量。仅靠这七种刷子往往不能满足要求,应用程序通过调用如下几种函数创建逻辑刷子,这些函数返回值均为刷子句柄。* 函数CreateHatchBrush()语法:HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);说明: 该创建一个带阴影的逻辑刷子。FnStyle指定的阴影格式如下:HS_BDLAGONAL 45度向上斜线组成的阴

26、影图案(自左到右)HS_CROSS 水平和垂直交叉组成的阴影图案HS_DIAGCROSS 45度斜线交叉组成的阴影图案HS_FDIAGONAL 45度向下斜线组成的阴影图案(自左到右)HS_HORZONA 水平线组成的阴影图案HS_VERTICAL 垂直线组成的阴影图案Clrref是具有COLORREF类型定义的刷子颜色值,可用宏指令RGB构造这个值。* 函数CreateSolidBrush()语法:HBRUSH CreateSolidBrush(COLORREF clrre);说明:该函数创建的是一种实心颜色的逻辑刷子。clrre含义同上。同样,使用创建刷子的函数时,要检查其返回,确保它是一

27、个有效的句柄。一旦创建了绘图工具之后,可以SelectObject函数把它选择到显示缓冲区里。在使用显示缓冲区之前,并不一定非要创建和选择绘图工具,Windows为每个显示缓冲区提供默认的绘图工具。例如:黑色笔,白色刷子和系统字体。DeleteObject函数用来删除不再需要的绘图工具,但不能删除一个已选进显示缓冲区的绘图工具,而是应该使用SelectObject函数恢复原有的绘图工具,然后再删除需要删除的工具。(3) 填 充 图 形绘制一些需要以某种图案进行填充的区域图形时,需要选定刷子作为绘图工具。Windows系统中预定义的刷子有七种,应用程序可以调用GetStockObject函数选用

28、其中一个,系统缺省的刷子是白色刷子。当靠这七种刷子不能满足要求时,应用程序通过调用Windows函数创建逻辑刷子,这些函数返回值均为刷子句柄。(4) 文字与字体Windows是使用定义好的与设备无关的字符集,Windows的文本字符也是图形,所以屏幕上所显示的用打印机或绘图仪等输出品的文本完全一样,做到所见即所得。文本绘制函数有:TextOut 以当前的字体写一字符串DrawText 在一个特定矩形区中绘制某一格式的文本ExtTextOut 在一个特定矩形区中,以当前字体写一字符串GrayString 用灰色文本写一字符串TabbedTextOut 写一带扩展字符的字符串要输出文本就离不开字体

29、。获取字体的相关信息可以使用函数:BOOL GetTextMetrics( LPTEXTMETRIC lpMetrics )结构TEXTMETRIC的定义如下所示:typedef struct tagTEXTMETRIC / tmLONG tmHeight; /字符高度LONG tmAscent; /字符上部高度(基线以上)LONG tmDescent; /字符下部高度(基线以下)LONG tmInternalLeading; /由tmHeight定义的字符高度的顶部空间数目LONG tmExternalLeading; /加在两行之间的空间数目LONG tmAveCharWidth; /平均

30、字符宽度LONG tmMaxCharWidth; /最宽字符的宽度LONG tmWeight; /字体的粗细轻重程度LONG tmOverhang; /加入某些拼接字体上的附加高度LONG tmDigitizedAspectX; /字体设计所针对的设备水平方向LONG tmDigitizedAspectY; /字体设计所针对的设备垂直方向BCHAR tmFirstChar; /为字体定义的第一个字符BCHAR tmLastChar; /为字体定义的最后一个字符BCHAR tmDefaultChar; /字体中所没有字符的替代字符BCHAR tmBreakChar; /用于拆字的字符BYTE tmItalic; /字体为斜体时非零BYTE tmUnderlined; /字体为下划线时非零BYTE tmStruckOut; /字体被删去时非零BYTE tmPitchAndFamily; /字体间距(低4位)和族(高4位)BYTE tmCharSet; /字体的字符集 TEXTMETRIC; GDI字体族和字样GDI字体族和字样表如下表所示:字体族 字体族常量 字样说明Dontcare FF_DONTCARE System 当不能提供字体信息或字体并不重要时使用Decorative FF_DECORATIVE Symbol

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1