北京交通大学 软件学院课件 Windows编程基础3.ppt_第1页
北京交通大学 软件学院课件 Windows编程基础3.ppt_第2页
北京交通大学 软件学院课件 Windows编程基础3.ppt_第3页
北京交通大学 软件学院课件 Windows编程基础3.ppt_第4页
北京交通大学 软件学院课件 Windows编程基础3.ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、概述:,GDI的基础 GDI高级图形函数,重点:,难点:,GDI高级图形函数的应用,GDI的基础,图形设备接口,3.1 Windows编程,图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在显示器或打印机上显示图形。,GDI是Windows非常重要的部分,不只为Windows编写的应用系统在显示视觉信息时使用GDI,就连Windows本身也使用GDI来显示接口对象,诸如菜单、滚动条、图标和鼠标光标。,从程序开发者的观点来看,GDI由几百个函数调用和一些相关的数据型态、宏和结构组成。但是在开始讲述这些函数的细节之前,先从巨观上了解一下GD

2、I的整体结构。,GDI原理,3.1 Windows编程,Windows 98和Microsoft Windows NT中的图形主要由GDI32.DLL动态链接库输出的函数来处理。,在Windows 98中,这个GDI32.DLL实际是利用16位GDI.EXE动态链接库来执行许多函数。在Windows NT中,GDI.EXE只用于16位的程序 。,这些动态链接库调用显示器和任何打印机驱动程序中的例程。显卡驱动程序存取显示器的硬件,打印机驱动程序将GDI命令转换为各种打印机能够理解的代码或者命令。显然,不同的显示卡和打印机要求不同的设备驱动程序。,GDI函数调用,3.1 Windows编程,组成G

3、DI的几百个函数呼叫可以分为几大类:,1.取得(或者建立)和释放(或者清除)设备内容的函数,在绘图时需要设备内容句柄。GetDC和RealseDC函数在非WM_PAINT的消息处理期间来做到这一点,而BeginPaint和EndPaint函数在进行绘图的WM_PAINT消息处理期间使用。,2.取得有关设备内容信息的函数,如使用GetTextMetrics函数来取得有关设备内容中目前所选字体的尺寸信息。,3.绘图函数,使用TextOut函数在窗口的显示区域显示一些文字。下面将看到,其它GDI函数还可画线、填入区域。,GDI函数调用,3.1 Windows编程,4.设定和取得设备内容参数的函数,例

4、如,用SetTextColor来指定TextOut所绘制的文字色彩 。使用SetTextAlign来告诉TextOut函数中的字符串的开始位置应该在字符串的右边而不是内定的左边。设备内容的所有属性都有默认值,取得设备内容时这些默认值就设定好了。对于所有的Set函数,都有相应的Get函数,以允许取得目前设备内容属性。,5.使用GDI对象的函数,GDI对象可以用于建立填入封闭区域的画刷、字体、位图以及GDI的其它一些方面。,第025课 Windows编程基础,GDI基本图形,3.1 Windows编程,直线和曲线,填入区域,线条是所有向量图形绘制系统的基础。GDI支持直线、矩形、椭圆(包括椭圆的子

5、集,也就是我们所说的“圆”)、椭圆圆周上的部分曲线即所谓的“弧”以及贝齐尔曲线(Bezier spline),所有更复杂的曲线可由折线(polyline)代替,折线通过一组非常短的直线来定义一条曲线。线条用设备内容中选中的目前画笔绘制。,当一系列直线或者曲线封闭了一个区域时,该区域可以使用目前GDI画刷对象进行填图。这个画刷可以是实心色彩、图案(可以是一系列的水平、垂直或者对角标记)或者是在区域内垂直或者水平重复的位图图像。,GDI基本图形,3.1 Windows编程,位图位图,位图位图是位的矩形数组,这些位对应于显示设备上的图素,它们是位映像图形的基础工具。位图通常用于在视讯显示器或者打印机

6、上显示复杂(一般都是真实的)图像。,文字,用于定义GDI字体对象和取得字体信息的数据结构。,设备内容,在一个图形输出设备(诸如屏幕或者打印机)上绘图时,首先必须获得一个设备内容(或者DC)的句柄。将句柄传回给程序时,Windows就给了程序使用设备的权限。然后在GDI函数中将这个句柄作为一个参数,向Windows标识要在其上进行绘图的设备 。,GDI的基本步骤,3.1 Windows编程,取得设备内容句柄,Windows提供了几种取得设备内容句柄的方法。如果在处理一个消息时取得了设备内容句柄,应该在退出窗口函数之前释放它(或者删除它)。一旦释放了句柄,它就不再有效了。对于打印机设备内容句柄,规

7、则就没有这么严格。最常用的取得并释放设备内容句柄的方法是,在处理WM_PAINT消息时,使用BeginPaint和EndPaint呼叫 。,hdc = BeginPaint (hwnd, ,变量ps是型态为PAINTSTRUCT的结构,该结构的hdc字段是BeginPaint传回的设备内容句柄。 PAINTSTRUCT结构又包含一个名为rcPaint的RECT(矩形)结构,rcPaint定义一个包围窗口显示区域无效范围的矩形。使用从BeginPaint获得的设备内容句柄,只能在这个区域内绘图。,GDI的基本步骤,3.1 Windows编程,Windows程序还可以在处理非WM_PAINT消息时

8、取得设备内容句柄。,hdc = GetDC (hwnd) ; 其它行程序 ReleaseDC (hwnd, hdc) ;,这个设备内容适用于窗口句柄为hwnd的显示区域。这些呼叫与BeginPaint和EndPaint的组合之间的基本区别是,利用从GetDC传回的句柄可以在整个显示区域上绘图。当然, GetDC和ReleaseDC不使显示区域中任何可能的无效区域变成有效。,GDI的基本步骤,3.1 Windows编程,使用位图时,取得一个“内存设备内容”有时是有用的。,hdcMem = CreateCompatibleDC (hdc) ; 其它行程序 DeleteDC (hdcMem) ;,可

9、以将位图选进内存设备内容,然后使用GDI函数在位图上绘画。,取得设备内容信息,iValue = GetDeviceCaps (hdc, iIndex) ;,程序取得一个设备内容的句柄时,Windows默认设定所有的属性。,例如,iIndex为HORZRES时将使GetDeviceCaps传回设备的宽度(单位为像素);iIndex为VERTRES时将让GetDeviceCaps传回设备的高度(单位为像素)。,3.1 Windows编程,GDI的实现,3.1 Windows编程,画点,可以仅使用SetPixel和GetPixel函数进行所需要的任何绘制,也可以在这些函数的基础上设计出简洁和构造良好

10、的图形编程系统。,SetPixel函数可以指定的x和y坐标以特定的颜色设定图素。,SetPixel (hdc, x, y, crColor) ;,第一个参数是设备内容的句柄。第二个和第三个参数指明了坐标位置 ,最后一个参数是COLORREF型态指定了颜色 。,GetPixel函数传回指定坐标处的图素颜色。,crColor = GetPixel (hdc, x, y) ;,GDI的实现,3.1 Windows编程,画线,Windows可以画直线,椭圆线和贝塞尔曲线。,LineTo 画直线。,Polyline和PolylineTo 画一系列相连的直线。,PolyPolyline 画多组相连的线。,

11、Arc 画椭圆线。,PolyBezier和PolyBezierTo 画贝齐尔曲线。,ArcTo和AngleArc 画椭圆线。,PolyDraw 画一系列相连的线以及贝齐尔曲线。,GDI的实现,3.1 Windows编程,画一条直线,必须调用两个函数。第一个函数指定了线的开始点,第二个函数指定了线的终点 。,MoveToEx (hdc, xBeg, yBeg, NULL) ; LineTo (hdc, xEnd, yEnd) ;,MoveToEx实际上不会画线,它只是设定了设备内容的“目前位置”属性。然后LineTo函数从目前的位置到它所指定的点画一条直线。目前位置只是用于其它几个GDI函数的开

12、始点。在内定的设备内容中,目前位置最初设定在点(0,0)。如果在调用LineTo之前没有设定目前位置,那么它将从显示区域的左上角开始画线 。,高级GDI函数,3.1 Windows编程,Rectangle (hdc, xLeft, yTop, xRight, yBottom) ;,画矩形,画椭圆,Ellipse (hdc, xLeft, yTop, xRight, yBottom) ;,画带圆角的矩形,RoundRect (hdc, xLeft, yTop, xRight, yBottom, xCornerEllipse, yCornerEllipse) ;,画椭圆的一部分,使其看起来像一个扇

13、形,Pie(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;,画椭圆的一部分,以呈弓形,Chord (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;,高级GDI函数,3.1 Windows编程,使用现有画笔(Stock Pens),Windows使用设备内容中目前选中的“画笔”来画线。画笔决定线的色彩、宽度和画笔样式,画笔样式可以是实线、点划线或者虚线。,内定设备内容中画笔为BLACK_PEN。不管映像方式是什么,这种画笔都画出一个图

14、素宽的黑色实线来。,BLACK_PEN是Windows提供的三种现有画笔之一,其它两种是WHITE_PEN和NULL_PEN,NULL_PEN什么都不画。也可自定画笔 。,Windows程序以句柄来使用画笔,且必须将画笔选进设备内容。,hPen = GetStockObject (WHITE_PEN) ;,SelectObject (hdc, hPen) ;,高级GDI函数,3.1 Windows编程,CreatePen函数的语法形如下:,hPen = CreatePen (iPenStyle, iWidth, crColor) ;,其中,iPenStyle参数确定画笔是实线、点线还是虚线,该

15、参数可以是WINGDI.H表头文件中定义的以下标识符,如下:,高级GDI函数,3.1 Windows编程,先定义三个变量来存放这些画笔的句柄。,static HPEN hPen1, hPen2, hPen3 ;,在处理WM_CREATE期间,可以建立三种画笔。,hPen1 = CreatePen (PS_SOLID, 1, 0) ; hPen2 = CreatePen (PS_SOLID, 3, RGB (255, 0, 0) ; hPen3 = CreatePen (PS_DOT, 0, 0) ;,SelectObject (hdc, hPen2) ;,在处理WM_DESTROY期间,可以删

16、除所建立的三种画笔。,DeleteObject (hPen1) ; DeleteObject (hPen2) ; DeleteObject (hPen3) ;,高级GDI函数,3.1 Windows编程,建立画刷,hBrush = CreateSolidBrush (crColor) ;,还可以使用由水平、垂直或者倾斜的线组成的“影线标记(hatch marks)”来建立画刷。,hBrush = CreateHatchBrush (iHatchStyle, crColor) ;,3.1 Windows编程,#include LRESULT CALLBACK WndProc (HWND, UIN

17、T, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) static TCHAR szAppName = TEXT (AltWind) ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc= WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL,IDC_ARROW)

温馨提示

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

评论

0/150

提交评论