第4章 Windows的图形设备接口及Windows绘图.ppt
《第4章 Windows的图形设备接口及Windows绘图.ppt》由会员分享,可在线阅读,更多相关《第4章 Windows的图形设备接口及Windows绘图.ppt(53页珍藏版)》请在课桌文档上搜索。
1、第4章 Windows的图形设备接口及Windows绘图,Windows图形设备接口(GDI)是为与设备无关的图形设计的。所谓设备的无关性,就是操作系统屏蔽了硬件设备的差异,因而设备无关性能使用户编程时无需考虑特殊的硬件设置。,一、图形设备接口(GDI),GDI负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字,是Windows系统的重要组成部分。,设备描述表即为设备环境的属性的集合。,应用程序与输出设备之间的桥梁,Win系统,外设,直接访问,统一的设备环境(DC),使应用程序与设备相连,1.GDI的一些基本概念,应用程序,设备描述表及其属性,通过设备描述表的句柄来间接地
2、存取,应用程序每一次图形操作均参照设备描述表中的属性执行,图形刷新是绘图过程中必须考虑的重要问题,刷新请求对刷新请求的响应刷新方法,包括,(1)刷新请求,2.图形刷新,(2)系统对刷新请求的响应 当用户区的内容需要刷新时,系统向应用程序消息队列发送WM_PAINT消息,系统在应用程序的消息队列中加入该消息,以通知窗口函数执行刷新处理,三种刷新,窗口移动后的刷新被覆盖区域的刷新对象穿越后的刷新(系统自动完成),用户区移动或显示用户窗口大小改变程序通过滚动条滚动窗口,窗口被另一个窗口覆盖的恢复如下拉式菜单关闭等,光标穿过用户区图标拖过用户区,窗口被另一个窗口覆盖的区域称为无效区域。Windows系
3、统为每个窗口建立了一个PAINTSTRUCT结构,该结构中包含了包围无效区域的一个最小矩形的结构RECT,应用程序可以根据这个无效矩形执行刷新操作。,Typedef struct tagPAINTSTRUCT HDC hdc;/设备环境句柄 BOOL fErase;/一般取真值,表示擦除无效矩形的背景 RECT rcPaint;/无效矩形标识 BOOL fRestore;/系统保留 BOOL fIncUpdate;/系统保留 BYTE rgbReserved16;/系统保留 PAINTSTRUCT;,常用的Windows应用程序刷新窗口的方法,保存副本。刷新时将副本拷贝到相应的窗口中,记录事件
4、。刷新时重新执行这个曾经发生的事件,重新绘制。将图形绘制处理程序放在消息WM_PAINT响应模块中,刷新时重绘图形,(3)有效的刷新方法,获取设备环境是应用程序输出图形的先决条件,常用的两种方法是调用函数BeginPaint或GetDC,由BeginPaint函数获取的设备环境要用EndPaint函数释放void EndPaint(HWND hwnd,PAINTSTRUCT&ps),3.获取设备环境的方法,(2)调用GetDC函数 如果绘图工作并非由WM_PAINT消息驱动,则调用GetDC函数获取设备环境。hdc=GetDC(hwnd);,由GetDC函数获取的设备环境必须用ReleaseD
5、C函数释放 void ReleaseDC(HWND hwnd);,映像模式定义了将逻辑单位转化为设备的度量单位以及设备的x方向和y方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况。,窗口:对应逻辑坐标系上程序员设定的区域视口:对应实际输出设备上程序员设定的区域,窗口和视口如何映射?,4.映像模式,坐标系统,逻辑坐标系统,设备坐标系统,应用程序可获取设备环境的当前映像模式,并根据需要设置映像模式。,相关函数,设置设备环境的映像模式SetMapMode(hdc,nMapMode);nMapMode为映像模式的整型标识符,获取当前设备环境的映像模式nMapMode=GetMa
6、pMode(hdc);,窗口区域的定义由SetWindowExtEx函数完成,其函数原型为:BOOL SetWindowExtEx(HDC hdc,int nHeight,nWidth,/以逻辑单位表示的窗口区域高宽度 LPSIZE lpSize,/函数调用前窗口区域尺寸的SIZE结构地址);,视口区域的定义由SetViewportExtEx函数完成,函数原型为:BOOL Set ViewportExtEx(HDC hdc,int nHeight,nWidth,/以物理设备单位表示的新视口区域高宽度LPSIZE lpSize);,只有在映射模式为MM_ANISOTROPIC和MM_ISOTRO
7、PIC时才有意义,视口的默认原点和窗口的默认原点均为(0,0)。可通过调用函数SetViewportOrgEx和SetWindowOrgEx设定窗口与视口的原点。SetWindowOrgEx函数的原型为:BOOL SetWindowOrgEx(HDC hdc,int X,Y,/以逻辑单位表示的窗口原点坐标LPPOINT lpPoint/函数调用前原点坐标的POINT结构的地址);,只有在映射模式为MM_ANISOTROPIC和MM_ISOTROPIC时才有意义,(1)画笔的创建 使用画笔之前必须事先定义一个画笔句柄。形式如下:HPEN hP;然后调用函数GetStockObject获取Wind
8、ows系统定义的四种画笔。例如获取画笔BLACK_PEN的形式如下:hP=GetStockObject(BLACK_PEN);,WHITE_PENBLACK_PENDC_PENNULL_PEN,二、绘图工具与颜色1.画笔,(2)创建新画笔,形式如下:hP=CreatePen(int nPenStyle,/确定画笔样式int nWidth,/画笔宽度COLORREF rgbColor/画笔颜色);,创建画笔后,必须调用SelectObject函数将其选入设备环境。SelectObject(hdc,hP);/hP为所创建或获取的画笔句柄,不再使用当前画笔时,需删除画笔,以免占内存 DeleteOb
9、ject(hP);,PS_DASH:虚线PS_DASHDOT:点划线PS_DASHDOTDOT:双点划线PS_DOT:点线PS_INSIDEFRAME:实线PS_NULL:无PS_SOLID:实线,画刷的创建与应用与画笔很相似,操作画刷也包括创建、选入设备环境和删除。(1)画刷的创建 使用画刷需事先定义一个画刷句柄。形式如下:HBRUSH hBr;/hBr为画刷句柄 然后调用函数GetStockObject获取Windows系统提供的7种画刷 hBr=(HBRUSH)GetStockObject(nBrushStyle)画刷样式,BLACK_BRUSH黑色画刷DKGRAY_BRUSH深灰色画刷
10、GRAY_BRUSH灰色画刷HOLLOW_BRUSH虚画刷LTGRAY_BRUSH亮灰色画刷NULL_BRUSH空画刷WHITE_BRUSH白色画刷,指定颜色画刷如何获得?,2.画刷,可调用函数CreateSolidBrush和CreateHatchBrush创建画刷,hBr=CreateSolidBrush(rgbColor);,创建具有指定颜色的单色画刷,创建指定阴影图案和颜色的画刷,(2)选入设备环境 创建画刷后,通过SelectObject(hdc,hBr);将其选入设备环境(3)删除画刷 不使用画刷时,可用DeleteObject(hBr);删除画刷,释放内存,Windows使用宏R
11、GB定义绘图的颜色,其形式为:RGB(nRed,nGreen,nBlue),红色值,蓝色值,绿色值,RGB(255,0,0),RGB(0,255,0),RGB(0,0,255),3.颜色,(1)设置画笔当前位置的函数MoveToEx,BOOL MoveToEx(HDC hdc,int X,Y,/X、Y分别为新位置的逻辑坐标 LPPOINT lpPoint/存放原画笔位置的POINT结构地址),(2)从当前位置向指定坐标点画直线的函数LineToEx,BOOL LineToEx(HDC hdc,int X,int Y)/X和Y为线段的终点坐标,(3)从当前位置开始,依次用线段连接lpPoints
12、中指定的各点BOOL Polyline(HDC hdc,LPPOINT lpPoints,/指向包含各点坐标的POINT结构数组的指针 int nCount/nCount为POINT数组中点的个数),三、常用绘图函数,(4)绘制椭圆弧线的函数ArcBOOL Arc(HDC hdc,int X1,intY1,/边框矩形左上角的逻辑坐标int X2,int Y2,/边框矩形右下角的逻辑坐标int X3,int Y3,/椭圆弧起始点坐标int X4,int Y4/椭圆弧终止点坐标),(5)绘制饼图,并用当前画刷进行填充BOOL Pie(HDC hdc,int X1,intY1,/边框矩形左上角的逻辑
13、坐标int X2,int Y2,/边框矩形右下角的逻辑坐标int X3,int Y3,/椭圆弧起始经线的确定点坐标int X4,int Y4/椭圆弧终止经线的确定点坐标),(6)绘制矩形,并用当前画刷进行填充BOOL Rectangle(HDC hdc,int X1,int Y1,int X2,int Y2),(X1,Y1)和(X2,Y2)分别为矩形的左上角和右下角的逻辑坐标,(7)绘制圆角矩形,并用当前画刷填充BOOL RoundRect(HDC hdc,int X1,int Y1,int X2,int Y2,int nHeight,int nWidth),圆角的高度和宽度,(8)绘制椭圆,
14、并用当前画刷填充 BOOL Ellipse(HDC hdc,intX1,intY1,intX2,intY2),(9)绘制多边形,并用当前画刷填充BOOL Polygon(HDC hdc,LPPOINT lpPoints,int nCount),包含各点坐标的POINT数组的地址,多边形点的个数,【例4-1】利用绘图函数创建填充区。共有三个填充图形,第一个是用深灰色画刷填充带圆角的矩形,第二个是采用亮灰色画刷填充一个椭圆形图,第三个是用虚画刷填充饼形图。,#include#include#includelong WINAPI WndProc(HWND hWnd,UINT iMessage,UIN
15、T wParam,LONG lParam);,使用虚画刷填充时,看不出填充效果!,四、应用实例,BOOL InitWindowsClass(HINSTANCE hInstance);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);HWND hWndMain,int WINAPI WinMain/主函数(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)MSG Message;if(!InitWindowsClass(hInstance)retur
16、n FALSE;if(!InitWindows(hInstance,nCmdShow)return FALSE;while(GetMessage(,long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)HDC hDC;/定义指向设备的句柄 HBRUSH hBrush;/定义指向画刷的句柄 HPEN hPen;/定义指向画笔的句柄 PAINTSTRUCT PtStr;/定义指向包含绘图信息的结构体变量,消息处理函数,switch(iMessage)/处理消息case WM_PAINT:/处理绘图消息 hDC=Beg
17、inPaint(hWnd,/采用亮灰色画刷,下面只改变画刷,不改变笔,SelectObject(hDC,hBrush);/选择画刷 Ellipse(hDC,150,50,200,150);/绘制椭圆 hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);/虚画刷 SelectObject(hDC,hBrush);/选择画刷 Pie(hDC,250,50,300,100,250,50,300,50);/绘制饼形 EndPaint(hWnd,BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)/初始化窗口HWND h
18、Wnd;hWnd=CreateWindow(WinFill,/生成窗口 填充示例程序,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);if(!hWnd)return FALSE;hWndMain=hWnd;ShowWindow(hWnd,nCmdShow);/显示窗口 UpdateWindow(hWnd);return TRUE;,BOOL InitWindowsClass(HINSTANCE hInstance)/定义窗口类 WNDCLASS WndClass;WndClass.cbC
19、lsExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH);WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);WndClass.hIcon=LoadIcon(NULL,END);WndClass.hInstance=hInstance;WndClass.lpfnWndProc=WndProc;WndClass.lpszClassName=WinFill;WndClass.lpszMenuName=NULL;WndClass.style
20、=CS_HREDRAW|CS_VREDRAW;return RegisterClass(,例:应用画笔和画刷等工具绘制如图所示的图形。,1#include2#include3#include4 long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);5 BOOL InitWindowsClass(HINSTANCE hInstance);6 BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);7 HWND hWndMain;/主函数8 int WINAPI Win
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 Windows的图形设备接口及Windows绘图 Windows 图形 设备 接口 绘图

链接地址:https://www.desk33.com/p-740501.html