教学课件第7章图形设备接口GDI

上传人:人*** 文档编号:570061729 上传时间:2024-08-01 格式:PPT 页数:30 大小:666.50KB
返回 下载 相关 举报
教学课件第7章图形设备接口GDI_第1页
第1页 / 共30页
教学课件第7章图形设备接口GDI_第2页
第2页 / 共30页
教学课件第7章图形设备接口GDI_第3页
第3页 / 共30页
教学课件第7章图形设备接口GDI_第4页
第4页 / 共30页
教学课件第7章图形设备接口GDI_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《教学课件第7章图形设备接口GDI》由会员分享,可在线阅读,更多相关《教学课件第7章图形设备接口GDI(30页珍藏版)》请在金锄头文库上搜索。

1、第7章 图形设备接口GDI本章主要介绍GDI的相关知识与编程方法。在应用程序中,绘图、输出文本、显示图片和打印等操作都需要使用GDI图形设备接口。GDI提供了一些函数,这些函数具有设计者需要的功能。7.1 回顾前面的例子前面章节曾经接触过与GDI有关的知识,即在使用GDI之前需要创建DC(GetDC),在不使用DC时需要将其释放(ReleaseDC),通过DC和GDI的相关函数可进行绘制操作。例如在第2章的例子中,如果要在窗口输出鼠标的当前坐标,需要编写如下代码:case WM_MOUSEMOVE:/得到当前鼠标的位置int xPos,yPos;xPos = LOWORD(lParam);yP

2、os = HIWORD(lParam); char szOutPut20;sprintf(szOutPut,x = %d,y = %d ,xPos,yPos);/得到DC句柄hDC = :GetDC(hWnd);/通过DC将文本输出到窗口上:TextOut(hDC,0,0,szOutPut,strlen(szOutPut);/释放DC句柄:ReleaseDC(hWnd,hDC);break;7.2 GDI操作函数本节将详细介绍GDI中常用的绘图函数,这些函数是图形绘制方面的基本函数,用这些函数可以绘制出任意图形。7.2.1 绘制文本TextOut和DrawText通过前面的学习已经知道,绘制文

3、本主要使用TextOut和DrawText这个函数,TextOut的定义如下。BOOL TextOut(HDC hdc,/DC句柄int nXStart,/要绘制文本的左上角x坐标int nYStart,/要绘制文本的左上角y坐标LPCTSTR lpString,/要输出的文本字符串int cbString/输出长度);TextOut根据给出的坐标和要绘制的长度绘制文本,而DrawText则通过给定的一个矩形区域来绘制文本,DrawText的定义如下。int DrawText(HDC hDC,/DC句柄LPCTSTR lpString,/要输出的文本字符串int nCount,/字符串的长度L

4、PRECT lpRect,/将文本绘制在一个矩形区域内UINT uFormat/绘制格式); 7.2.2 绘制点SetPixel绘制点使用SetPixel函数,SetPixel函数的定义如下。COLORREF SetPixel(HDC hdc,/DC句柄int X,/点的x坐标int Y,/点的y坐标COLORREF crColor/点的颜色);给出一个点的坐标和颜色,便可使用SetPixel在指定的DC上绘制点。有时需要改变绘制的点的大小,这时必须改变当前设备的画笔,改变画笔的方法在后面介绍。7.2.3 绘制直线MoveToEx和LineTo绘制直线分为两个步骤,即先使用MoveToEx设置

5、线的起点,再使用LineTo指定一个终点,并在起点到终点之间画线。MoveToEx定义如下。BOOL MoveToEx(HDC hdc,/DC句柄int X,/起点的x坐标int Y,/起点的y坐标LPPOINT lpPoint/一个POINT结构体类型的变量,将先前的起点放入POINT结构体中);7.2.4 绘制椭圆Ellipse绘制椭圆可以使用Ellipse函数,Ellipse的定义如下。BOOL Ellipse(HDC hdc,/DC句柄int nLeftRect,/椭圆外切矩形的左上角x坐标int nTopRect,/椭圆外切矩形的左上角y坐标int nRightRect,/椭圆外切矩

6、形的右下角x坐标int nBottomRect/椭圆外切矩形的右下角y坐标);7.2.5 绘制矩形FillRect与Rectangle绘制矩形的2个函数分别定义如下。int FillRect(HDC hDC,/DC句柄CONST RECT *lprc,/RECT结构体指针,表示填充的矩形区域HBRUSH hbr/矩形背景颜色用此参数指定画刷填充);BOOL Rectangle(HDC hdc, /DC句柄int nLeftRect,/矩形区域左上角x坐标int nTopRect,/矩形区域左上角y坐标int nRightRect,/矩形区域右下角x坐标int nBottomRect/矩形区域右

7、下角y坐标);7.3 坐标映射通常,绘图时的坐标原点为窗口的左上角,并且x轴向右,y轴向下。坐标每增1,实际上是像素值增1。这些参数可以通过改变坐标映射模式来修改。坐标映射模式的相关函数如表所示。7.4 MFC中封装的GDIMFC对GDI进行了封装,其中CDC是最基本的DC类。CClientDC与CWindowDC从CDC派生。一些GDI操作函数也被封装到CDC中。7.4.1 使用CDC 、CClientDC和CWindowDC绘制图形MFC对DC的封装是CDC类。CDC类的成员m_hDC为DC句柄。同时CDC将GDI的操作函数也全部封装起来,例如下面的代码会在窗口中输出文本。/*纯GDI操作

8、HDC hDC = :GetDC(this-m_hWnd);:TextOut(hDC,0,0,Hello World,strlen(HelloWorld);:ReleaseDC(this-m_hWnd,hDC);*/CDC *pDC = this-GetDC();/CWnd:GetDCpDC-TextOut(0,0,Hello World);/封装TextOutthis-ReleaseDC(pDC);/CWnd:ReleaseDC7.4.2 示例使用CClientDC绘制椭圆本例通过一个简单的示例来演示如何使用CClientDC进行绘图。具体操作步骤如下。(1)新建单文档程序,工程名为eg_1

9、_clientdc。(2)在视图类的OnDraw函数中添加代码如下。7.5 字体使用TextOut或DrawText函数可以输出文本。通过设置设备上下文中的字体可以改变输出文本的字体。7.5.1 创建字体在MFC中,使用CFont管理字体的相关操作。使用CFont:CreatePointFont可以创建一个字体对象。例如,下列代码可以创建一个“宋体;9号”的字体。CFont font;font.CreatePointFont(90,宋体);/90表示9号字体,100表示10号7.5.2 设置字体使用SelectObject可以将一个GDI对象设置到当前DC中,并返回先前的GDI对象。GDI对象

10、包括画笔(CPen)、画刷(CBrush)、字体(CFont)等。以下代码可以将某一字体设置到当前DC中。使用SelectObject可以将一个GDI对象设置到当前DC中,并返回先前的GDI对象。GDI对象包括画笔(CPen)、画刷(CBrush)、字体(CFont)等。以下代码可以将某一字体设置到当前DC中。CFont font,*pOldFont;font.CreatePointFont(90,宋体);/创建字体CClientDC *pClientDC = (CClientDC*)this-GetDC();/得到CClientDCpOldFont = pClientDC-SelectObj

11、ect(&font);/设置字体pClientDC-TextOut(0,0,ABC);/输出文本pClientDC-SelectObject(pOldFont);/将先前字体设置回DC 7.6 画笔MFC中使用CPen管理画笔的相关操作。当绘制带边的图形(文字不属于带边图形)时需要使用画笔指定边的样式。画笔也是一种GDI对象,所以在使用画笔之前要调用SelectObject设置画笔。使用CreatePen可以创建一个画笔,CreatePen的定义如下。BOOL CreatePen( int nPenStyle, /画笔样式int nWidth, /线宽COLORREF crColor /颜色)

12、; 7.7 画刷MFC中使用CBrush管理画刷的相关操作。当绘制带面的图形时需要指定画刷,例如椭圆、矩形等图形。同样,在使用画刷时要调用SelectObject来设置画刷。画刷的创建通常使用其构造函数完成。其常用构造函数及重载定义如下。CBrush( ); /不创建画刷CBrush( COLORREF crColor );/创建某一颜色的画刷CBrush( CBitmap* pBitmap );/创建图像画刷7.8 位图MFC中使用CBitmap管理画笔的相关操作。操作位图主要分为装载位图与显示位图这两步操作。7.8.1 装载位图载入位图有2种方式,即使用CBitmap:LoadBitmap

13、从资源中载入和使用LoadImage(SDK函数,不是CBitmap成员)从磁盘文件中载入。CBitmap:LoadBitmap的定义如下。BOOL LoadBitmap(UINT nIDResource /位图资源ID);LoadImage的定义如下。HANDLE LoadImage(HINSTANCE hinst,/拥有Image的模块实例句柄LPCTSTR lpszName,/Image名或ID值UINT uType,/Image类型int cxDesired,/宽度int cyDesired,/高度UINT fuLoad/载入其他参数); 7.8.2 显示位图显示位图有2种方式,即普通

14、显示与拉伸显示。普通显示使用BitBlt,如果要拉伸显示,需要使用StretchBlt。BitBlt与StretchBlt的定义如下。7.8.3 示例显示位图本节将通过一个实例来演示如何使用前面的函数来显示位图。具体操作步骤如下。(1)新建单文档程序,工程名为eg_2_displaybitmap。(2)添加一个位图资源,ID为IDB_BITMAP1,如图所示。(3)设计菜单资源,添加菜单项,如图所示。(4)添加视图类成员变量,并在构造函数中初始化。(5)在视图类的OnDraw函数中显示位图,相应代码如下。(6)添加4个菜单项的消息响应函数,相应代码如下。7.9 应用案例自绘制按钮制作观察自己周

15、围正在使用的程序,有很多程序带有“皮肤”功能,使用皮肤可以使程序更加美观、界面设计更加灵活。本章将介绍如何开发一个带皮肤功能的按钮控件。7.9.1 案例效果图程序开发完毕后的运行结果如图所示。7.9.2 需要掌握的知识点开发程序过程中需要掌握的知识点如下。对话框编程基础。控件编程基础,主要是按钮控件。GDI编程基础,包括字体、画刷、位图等相关操作。控件皮肤编程原理。7.9.3 控件皮肤编程原理MFC中的常用控件都对应一个控件类,例如按钮控件对应CButton控件类、列表框控件对应CListBox控件类。Windows提供给用户一个接口,当用户设置控件的Owner Draw属性时,控件会发送WM

16、_DRAWITEM消息。通过处理WM_DRAWITEM便可以进行控件的“自绘制”。7.9.4 开发过程本案例的重点不是为了开发一个具体的工程,而是开发一个COwnerDrawButton类,当按钮对象关联的控件类是COwnerDrawButton或使用COwnerDrawButton动态创建按钮对象时。控件会自动带有皮肤功能。具体的操作步骤如下。7.10 应用案例自绘制表头的列表控件本节将在上一章的示例带有排序与自绘制表头工程的列表控件的基础上,对控件进行升级,使控件的表头具有自绘制功能。7.10.1 案例效果图程序开发完毕后,效果如图所示。7.10.2 开发过程本例是在原来控件类的基础上升级,所以初期操作步骤与前面一样,具体如下。7.11 小结本章主要介绍了如何使用GDI进行绘图,其中包括一些GDI绘图函数以及字体、画笔、画刷、位图等GDI对象的使用方法。最后通过2个应用案例演示了GDI操作在实际开发中的应用。使用GDI对象进行编程时,需要注意对象的释放。没有正确释放GDI资源有时会导致程序资源不足而意外退出。位图显示过程中只能显示BITMAP即“.bmp”类型的文件。VC+ 6.0对非“.bmp”类型文件的操作有些复杂,需要使用COM操作。如果读者对此感兴趣,可以查找MSDN中COM接口IPicture的使用。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号