【教学课件】第7章图形设备接口GDI.ppt

上传人:小飞机 文档编号:4879278 上传时间:2023-05-21 格式:PPT 页数:30 大小:666.50KB
返回 下载 相关 举报
【教学课件】第7章图形设备接口GDI.ppt_第1页
第1页 / 共30页
【教学课件】第7章图形设备接口GDI.ppt_第2页
第2页 / 共30页
【教学课件】第7章图形设备接口GDI.ppt_第3页
第3页 / 共30页
【教学课件】第7章图形设备接口GDI.ppt_第4页
第4页 / 共30页
【教学课件】第7章图形设备接口GDI.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《【教学课件】第7章图形设备接口GDI.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第7章图形设备接口GDI.ppt(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);y

2、Pos=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,/字符串的长度LPRECT

4、 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中封装的GDI,MFC对GDI进行了封装,其中CDC是最基本的DC类。CClientDC与CWindowDC从CDC派生。一些GDI操作函数也被封装到CDC中。,7.4.1 使用CDC、CClientDC和CWindowDC绘制图形,MFC对DC的封装是CDC类。CDC类的成员m_hDC为DC句柄。同时CDC将GDI的操作函数也全部封装起来,例如下面的代码会在窗口中输出文本。/*纯

8、GDI操作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:ReleaseDC,7.4.2 示例使用CClientDC绘制椭圆,本例通过一个简单的示例来演示如何使用CClientDC进行绘图。具体操作步骤如下。(1)新建单文档程序,工程名为eg

9、_1_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

10、对象。GDI对象包括画笔(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-Select

11、Object(/将先前字体设置回DC,7.6 画笔,MFC中使用CPen管理画笔的相关操作。当绘制带边的图形(文字不属于带边图形)时需要使用画笔指定边的样式。画笔也是一种GDI对象,所以在使用画笔之前要调用SelectObject设置画笔。使用CreatePen可以创建一个画笔,CreatePen的定义如下。BOOL CreatePen(int nPenStyle,/画笔样式int nWidth,/线宽COLORREF crColor/颜色);,7.7 画刷,MFC中使用CBrush管理画刷的相关操作。当绘制带面的图形时需要指定画刷,例如椭圆、矩形等图形。同样,在使用画刷时要调用SelectO

12、bject来设置画刷。画刷的创建通常使用其构造函数完成。其常用构造函数及重载定义如下。CBrush();/不创建画刷CBrush(COLORREF crColor);/创建某一颜色的画刷CBrush(CBitmap*pBitmap);/创建图像画刷,7.8 位图,MFC中使用CBitmap管理画笔的相关操作。操作位图主要分为装载位图与显示位图这两步操作。,7.8.1 装载位图,载入位图有2种方式,即使用CBitmap:LoadBitmap从资源中载入和使用LoadImage(SDK函数,不是CBitmap成员)从磁盘文件中载入。CBitmap:LoadBitmap的定义如下。BOOL Load

13、Bitmap(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种方式,即普通显示与拉伸显示。普通显示使用BitBlt,如果要拉伸显示,需要使用StretchBlt。BitBlt与StretchBlt的定义如下。,7.8.3 示例显示位

14、图,本节将通过一个实例来演示如何使用前面的函数来显示位图。具体操作步骤如下。(1)新建单文档程序,工程名为eg_2_displaybitmap。(2)添加一个位图资源,ID为IDB_BITMAP1,如图所示。(3)设计菜单资源,添加菜单项,如图所示。(4)添加视图类成员变量,并在构造函数中初始化。(5)在视图类的OnDraw函数中显示位图,相应代码如下。(6)添加4个菜单项的消息响应函数,相应代码如下。,7.9 应用案例自绘制按钮制作,观察自己周围正在使用的程序,有很多程序带有“皮肤”功能,使用皮肤可以使程序更加美观、界面设计更加灵活。本章将介绍如何开发一个带皮肤功能的按钮控件。,7.9.1

15、案例效果图,程序开发完毕后的运行结果如图所示。,7.9.2 需要掌握的知识点,开发程序过程中需要掌握的知识点如下。对话框编程基础。控件编程基础,主要是按钮控件。GDI编程基础,包括字体、画刷、位图等相关操作。控件皮肤编程原理。,7.9.3 控件皮肤编程原理,MFC中的常用控件都对应一个控件类,例如按钮控件对应CButton控件类、列表框控件对应CListBox控件类。Windows提供给用户一个接口,当用户设置控件的Owner Draw属性时,控件会发送WM_DRAWITEM消息。通过处理WM_DRAWITEM便可以进行控件的“自绘制”。,7.9.4 开发过程,本案例的重点不是为了开发一个具体

16、的工程,而是开发一个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备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号