[精选]Windows的图形设备接口及Windows绘图.pptx

上传人:lil****205 文档编号:96462506 上传时间:2023-11-29 格式:PPTX 页数:54 大小:246.86KB
返回 下载 相关 举报
[精选]Windows的图形设备接口及Windows绘图.pptx_第1页
第1页 / 共54页
[精选]Windows的图形设备接口及Windows绘图.pptx_第2页
第2页 / 共54页
点击查看更多>>
资源描述

《[精选]Windows的图形设备接口及Windows绘图.pptx》由会员分享,可在线阅读,更多相关《[精选]Windows的图形设备接口及Windows绘图.pptx(54页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第4 4章章 Windows Windows的图形设备接口及的图形设备接口及WindowsWindows绘图绘图 Windows图形设备接口图形设备接口GDI是为与设备无是为与设备无关的图形设计的。所谓设备的无关性,就是操关的图形设计的。所谓设备的无关性,就是操作系统屏蔽了硬件设备的差异,因而设备无关作系统屏蔽了硬件设备的差异,因而设备无关性能使用户编程时无需考虑特殊的硬件设置。性能使用户编程时无需考虑特殊的硬件设置。Windows支持与设备无关的图形支持与设备无关的图形利用利用GDI和和Windows设设备驱动程序备驱动程序开发人员只要建开发人员只要建立与输出设备的立与输出设备的关联,让系

2、统加关联,让系统加载相应的设备驱载相应的设备驱动程序即可动程序即可一、图形设备接口一、图形设备接口GDIGDI负责系统与用户或绘图程序之间的信息交换,并控制负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字,在输出设备上显示图形或文字,是是Windows系统的重系统的重要组成局部。要组成局部。设备描述表即为设备描述表即为设备环境设备环境的属性的集合。的属性的集合。应用程序与应用程序与输出设备之输出设备之间的桥梁间的桥梁Win系统系统外设外设直接访问直接访问不允许不允许统一的设备环境统一的设备环境DC提供提供使应用程序与设备相连使应用程序与设备相连用用户户为确保图形输出为确

3、保图形输出的设备无关性的设备无关性1.GDI的一些基本概念的一些基本概念应应用用程程序序设备描设备描述表及述表及其属性其属性通过设备描述表的句柄来间接地存取通过设备描述表的句柄来间接地存取应用程序每一次图形应用程序每一次图形操作均参照设备描述操作均参照设备描述表中的属性执行表中的属性执行图形刷新图形刷新是绘图过程中必须考虑的重要问题是绘图过程中必须考虑的重要问题刷新请求刷新请求刷新请求刷新请求对刷新请求的响应对刷新请求的响应对刷新请求的响应对刷新请求的响应刷新方法刷新方法刷新方法刷新方法包括1 刷新请刷新请求求 应用程序在窗口中应用程序在窗口中绘制了一个椭圆,绘制了一个椭圆,颜色列表框覆盖了颜

4、色列表框覆盖了椭圆的一部分椭圆的一部分关闭颜色选框后,关闭颜色选框后,应用程序需要恢应用程序需要恢复被覆盖部分的复被覆盖部分的颜色和形状颜色和形状窗口大小的调整窗口大小的调整窗口移动窗口移动被覆盖后的恢复被覆盖后的恢复2.图形刷新图形刷新2 系统对刷新请求的响应系统对刷新请求的响应 当用户区的内容需要刷新时,系统向应用程序消当用户区的内容需要刷新时,系统向应用程序消息队列发送息队列发送WM_PAINT消息,系统在应用程序的消消息,系统在应用程序的消息队列中参加该消息,以通知窗口函数执行刷新处理息队列中参加该消息,以通知窗口函数执行刷新处理三种三种刷新刷新窗口移动后的刷新窗口移动后的刷新被覆盖区

5、域的刷新被覆盖区域的刷新对象穿越后的刷新对象穿越后的刷新系统自动完成用户区移动或显示用户区移动或显示用户窗口大小改变用户窗口大小改变程序通过滚动条滚动窗口程序通过滚动条滚动窗口窗口被另一个窗口覆盖的窗口被另一个窗口覆盖的恢复如下拉式菜单关闭等恢复如下拉式菜单关闭等光标穿过用户区光标穿过用户区图标拖过用户区图标拖过用户区窗口被另一个窗口覆盖的区域称为无效区域。窗口被另一个窗口覆盖的区域称为无效区域。Windows系统为每个窗口建立了一个系统为每个窗口建立了一个PAINTSTRUCT结构,该结构,该结构中包含了包围无效区域的一个最小矩形的结构结构中包含了包围无效区域的一个最小矩形的结构RECT,应

6、用,应用程序可以根据这个无效矩形执行刷新操作。程序可以根据这个无效矩形执行刷新操作。Typedef struct tagPAINTSTRUCTTypedef struct tagPAINTSTRUCT HDC hdc;HDC hdc;/设备环境句柄设备环境句柄 BOOL fErase;BOOL fErase;/一般取真值,表示擦除无效矩形的一般取真值,表示擦除无效矩形的背景背景 RECT rcPaint;RECT rcPaint;/无效矩形标识无效矩形标识 BOOL fRestore;BOOL fRestore;/系统保存系统保存 BOOL fIncUpdate;BOOL fIncUpdate

7、;/系统保存系统保存 BYTE rgbReserved16 BYTE rgbReserved16;/系统保存系统保存 PAINTSTRUCT;PAINTSTRUCT;rcPaint 为标准的为标准的RECT数据结构,数据结构,其作用是标识无效矩形,它包含了其作用是标识无效矩形,它包含了无效矩形的左上角和右下角的坐标无效矩形的左上角和右下角的坐标常用的常用的Windows应用应用程序刷新窗口程序刷新窗口的方法的方法保存副本。刷保存副本。刷新时将副本拷新时将副本拷贝到相应的窗贝到相应的窗口中口中记录事件。刷新记录事件。刷新时重新执行这个时重新执行这个曾经发生的事件曾经发生的事件重新绘制。将图形重新

8、绘制。将图形绘制处理程序放在绘制处理程序放在消息消息WM_PAINT响响应模块中,刷新时应模块中,刷新时重绘图形重绘图形3 有效的刷新方法有效的刷新方法获取设备环境是应用程序输出图形的先决条件,常用的两种方法获取设备环境是应用程序输出图形的先决条件,常用的两种方法是调用函数是调用函数BeginPaint或或GetDC(1)调用调用BeginPaint函数函数 应用程序响应应用程序响应WM_PAINT消息进行图形刷新时,主要通过消息进行图形刷新时,主要通过调用调用BeginPaint函数获取设备环境函数获取设备环境 hdc=BeginPaint(hwnd,&ps)hdc=BeginPaint(h

9、wnd,&ps);/ps /ps为为PAINTSTRUCTPAINTSTRUCT类型结构类型结构定义方式为:定义方式为:PAINTSTRUCT ps;PAINTSTRUCT ps;系统获取设备环境的系统获取设备环境的同时填写同时填写ps结构,以结构,以标识无效矩形区标识无效矩形区由由BeginPaint函数获取的设备环境要用函数获取的设备环境要用EndPaint函数释放函数释放void EndPaintHWND hwnd,PAINTSTRUCT&ps3.获取设备环境的方法获取设备环境的方法2 调用调用GetDC函数函数 如果绘图工作并非由如果绘图工作并非由WM_PAINT消息驱动,则调用消息驱

10、动,则调用GetDC函数获取设备环境。函数获取设备环境。hdc=GetDChdc=GetDChwndhwnd;由由GetDC函数获取的设备环境必须用函数获取的设备环境必须用ReleaseDC函数释放函数释放 void ReleaseDCHWND hwnd;映像模式定义了将逻辑单位转化为设备的度量单位以及映像模式定义了将逻辑单位转化为设备的度量单位以及设备的设备的x方向和方向和y方向,程序员可在一个统一的逻辑坐标系中操方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况。作而不必考虑输出设备的坐标系情况。窗口:对应逻辑坐标系上程序员设定的区域窗口:对应逻辑坐标系上程序员设定的

11、区域视口:对应实际输出设备上程序员设定的区域视口:对应实际输出设备上程序员设定的区域窗口和视口窗口和视口如何映射?如何映射?4.映像模式映像模式默认的映射模式默认的映射模式将窗口中的对称将窗口中的对称图形映射到视口图形映射到视口时仍为对称图形时仍为对称图形按照窗口和视口的按照窗口和视口的坐标比例进行映射坐标比例进行映射坐标坐标系统系统逻辑坐标系统逻辑坐标系统设备坐标系统设备坐标系统屏幕坐标系统屏幕坐标系统窗口坐标系统窗口坐标系统用户区坐标系统用户区坐标系统 应用程序可获取设备环境的当前映像模式,并根据需要设应用程序可获取设备环境的当前映像模式,并根据需要设置映像模式。置映像模式。相关相关函数函

12、数设置设备环境的映像模式设置设备环境的映像模式SetMapModeSetMapModehdc,nMapModehdc,nMapMode;nMapMode为映像模式的整型标识符为映像模式的整型标识符获取当前设备环境的映像模式获取当前设备环境的映像模式nMapMode=GetMapModenMapMode=GetMapModehdchdc;窗口区域的定义由窗口区域的定义由SetWindowExtEx函数完成,其函数原型为:函数完成,其函数原型为:BOOL SetWindowExtExBOOL SetWindowExtEx HDC hdc,HDC hdc,int nHeight,nWidth int

13、 nHeight,nWidth,/以逻辑单位表示的窗口区域高宽度以逻辑单位表示的窗口区域高宽度 LPSIZE lpSize LPSIZE lpSize,/函数调用前窗口区域尺寸的函数调用前窗口区域尺寸的SIZESIZE结构地结构地址址;视口区域的定义由视口区域的定义由SetViewportExtEx函数完成,函数原型为:函数完成,函数原型为:BOOL Set ViewportExtEx ViewportExtExHDC hdc,HDC hdc,int nHeight,nWidth,/int nHeight,nWidth,/以物理设备单位表示的新视口区域高宽度以物理设备单位表示的新视口区域高宽度

14、LPSIZE lpSizeLPSIZE lpSize;只有在映射模式为只有在映射模式为MM_ANISOTROPIC和和MM_ISOTROPIC时才有意义时才有意义视口的默认原点和窗口的默认原点均为视口的默认原点和窗口的默认原点均为0,0。可通过调用。可通过调用函数函数SetViewportOrgEx和和SetWindowOrgEx设定窗口与视口的设定窗口与视口的原点。原点。SetWindowOrgEx函数的原型为:函数的原型为:BOOL SetWindowOrgExBOOL SetWindowOrgExHDC hdc,HDC hdc,int X,Yint X,Y,/以逻辑单位表示的窗口原点坐标

15、以逻辑单位表示的窗口原点坐标LPPOINT lpPointLPPOINT lpPoint/函数调用前原点坐标的函数调用前原点坐标的POINTPOINT结构的地址结构的地址;只有在映射模式为只有在映射模式为只有在映射模式为只有在映射模式为MM_ANISOTROPICMM_ANISOTROPIC和和和和MM_ISOTROPICMM_ISOTROPIC时才有意义时才有意义时才有意义时才有意义1 画笔的创立画笔的创立 使用画笔之前必须事先定义一个画笔句柄。形式如下:使用画笔之前必须事先定义一个画笔句柄。形式如下:HPEN hP;然后调用函数然后调用函数GetStockObject获取获取Windows

16、系统定义的四种画笔。系统定义的四种画笔。例如获取画笔例如获取画笔BLACK_PEN的形式如下:的形式如下:hP=GetStockObject hP=GetStockObjectBLACK_PENBLACK_PEN;WHITE_PENWHITE_PENBLACK_PENBLACK_PENDC_PENDC_PENNULL_PENNULL_PEN画笔的操作画笔的操作创建画笔创建画笔将画笔选入设备环境将画笔选入设备环境删除画笔删除画笔二、绘图工具与颜色二、绘图工具与颜色1.画笔画笔2 创立新画笔,形式如下:创立新画笔,形式如下:hP=CreatePenhP=CreatePenint nPenStyle

17、,int nPenStyle,/确定确定画笔样式画笔样式int nWidth,int nWidth,/画笔宽度画笔宽度COLORREF rgbColor/COLORREF rgbColor/画笔颜色画笔颜色;创立画笔后,必须调用创立画笔后,必须调用SelectObject函数将其选入设备环境。函数将其选入设备环境。SelectObject SelectObjecthdc,hPhdc,hP;/hP;/hP为所创立或获取的画笔句为所创立或获取的画笔句柄柄不再使用当前画笔时,需删除画笔,以免占内存不再使用当前画笔时,需删除画笔,以免占内存 DeleteObject DeleteObjecthPhP;

18、PS_DASH:虚线虚线PS_DASHDOT:点划线点划线PS_DASHDOTDOT:双点划线双点划线PS_DOT:点线点线PS_INSIDEFRAME:实线实线PS_NULL:无无PS_SOLID:实线实线 画刷的创立与应用与画笔很相似,操作画刷也包括创立、选画刷的创立与应用与画笔很相似,操作画刷也包括创立、选入设备环境和删除。入设备环境和删除。1 画刷的创立画刷的创立 使用画刷需事先定义一个画刷句柄。形式如下:使用画刷需事先定义一个画刷句柄。形式如下:HBRUSH hBr;/hBr为画刷句柄为画刷句柄 然后调用函数然后调用函数GetStockObject获取获取Windows系统提供的系统

19、提供的7种画刷种画刷 hBr=HBRUSHGetStockObjectnBrushStylenBrushStyle画刷样式画刷样式BLACK_BRUSH黑色画刷黑色画刷DKGRAY_BRUSH 深灰色画刷深灰色画刷GRAY_BRUSH灰色画刷灰色画刷HOLLOW_BRUSH 虚画刷虚画刷LTGRAY_BRUSH亮灰色画刷亮灰色画刷NULL_BRUSH空画刷空画刷WHITE_BRUSH白色画刷白色画刷指定颜色画指定颜色画刷如何获得刷如何获得?2.画刷画刷可调用函数可调用函数CreateSolidBrush和和CreateHatchBrush创立画刷,创立画刷,hBr=CreateSolidBru

20、shhBr=CreateSolidBrushrgbColorrgbColor;创立具有创立具有指定颜色指定颜色的单色画刷的单色画刷创立指定阴创立指定阴影图案和颜影图案和颜色的画刷色的画刷2 选入设备环境选入设备环境 创立画刷后,创立画刷后,通过通过SelectObjecthdc,hBr;将其选入设备环境将其选入设备环境3 删除画刷删除画刷 不使用画刷时,可用不使用画刷时,可用DeleteObjecthBr;删除画刷,释放内存删除画刷,释放内存hBr=CreateHatchBrushhBr=CreateHatchBrush(int nHctchStyle,(int nHctchStyle,COL

21、ORREF rgbColor COLORREF rgbColor););HS_BDIAGONAL 45度从左上到右下度从左上到右下HS_DIAGCROSS 45度叉线度叉线HS_FDIAGONAL 45度从左下到右上度从左下到右上HS_CROSS 垂直相交的阴影线垂直相交的阴影线HS_HORIZONTAL 水平阴影线水平阴影线HS_VERTICAL垂直阴影线垂直阴影线 Windows使用宏使用宏RGB定义绘图的颜色,其形式为定义绘图的颜色,其形式为:RGBnRed,nGreen,nBlue 红色值红色值蓝色值蓝色值绿色值绿色值RGB255,0,0RGB0,255,0RGB0,0,2553.颜色

22、颜色1设置画笔当前位置的函数设置画笔当前位置的函数MoveToEx,BOOL MoveToExHDC hdc,int X,Y,/X、Y分别为新位置的逻辑坐标分别为新位置的逻辑坐标 LPPOINT lpPoint/存放原画笔位置的存放原画笔位置的POINT结构地址结构地址2 从当前位置向指定坐标点画直线的函数从当前位置向指定坐标点画直线的函数LineToEx,BOOL LineToExBOOL LineToExHDC hdc,int X,int YHDC hdc,int X,int Y /X /X和和Y Y为线段的终点坐标为线段的终点坐标3 从当前位置开始,依次用线段连接从当前位置开始,依次用线

23、段连接lpPoints中指定的各点中指定的各点BOOL Polyline HDC hdc,LPPOINT lpPoints,/指向包含各点坐标的指向包含各点坐标的POINT结构数组的指针结构数组的指针 int nCount /nCount为为POINT数组中点的个数数组中点的个数三、三、常用绘图函数常用绘图函数4 绘制椭圆弧线的函数绘制椭圆弧线的函数ArcBOOL ArcHDC hdc,int X1,intY1,/边框矩形左上角的逻辑坐标边框矩形左上角的逻辑坐标int X2,int Y2,/边框矩形右下角的逻辑坐标边框矩形右下角的逻辑坐标int X3,int Y3,/椭圆弧起始点坐标椭圆弧起始

24、点坐标int X4,int Y4/椭圆弧终止点坐标椭圆弧终止点坐标(x1,y1)(x2,y2)(x3,y3)(x4,y4)所画曲线所画曲线5 绘制饼图,并用当前画刷进行填充绘制饼图,并用当前画刷进行填充BOOL PieHDC hdc,int X1,intY1,/边框矩形左上角的逻辑坐标边框矩形左上角的逻辑坐标int X2,int Y2,/边框矩形右下角的逻辑坐标边框矩形右下角的逻辑坐标int X3,int Y3,/椭圆弧起始经线确实定点坐标椭圆弧起始经线确实定点坐标int X4,int Y4/椭圆弧终止经线确实定点坐标椭圆弧终止经线确实定点坐标(x1,y1)(x2,y2)(x3,y3)(x4,

25、y4)所填区域所填区域6 绘制矩形,并用当前画刷进行填充绘制矩形,并用当前画刷进行填充BOOL RectangleHDC hdc,int X1,int Y1,int X2,int Y2X1,Y1和和X2,Y2分别为矩形的左上分别为矩形的左上角和右下角的逻辑坐标角和右下角的逻辑坐标7 绘制圆角矩形,并用当前画刷填充绘制圆角矩形,并用当前画刷填充BOOL RoundRect HDC hdc,int X1,int Y1,int X2,int Y2,int nHeight,int nWidth圆角的高度和宽圆角的高度和宽度度8 绘制椭圆,并用当前画刷填充绘制椭圆,并用当前画刷填充 BOOL Ellip

26、seHDC hdc,intX1,intY1,intX2,intY29绘制多边形,并用当前画刷填充绘制多边形,并用当前画刷填充BOOL PolygonHDC hdc,LPPOINT lpPoints,int nCount包含各点坐标的包含各点坐标的POINT数组的地址数组的地址多边形点的个数多边形点的个数【例【例4-1】利用绘图函数创立填充区。共有三个填充图形,第一】利用绘图函数创立填充区。共有三个填充图形,第一个是用深灰色画刷填充带圆角的矩形,第二个是采用亮灰色画刷个是用深灰色画刷填充带圆角的矩形,第二个是采用亮灰色画刷填充一个椭圆形图,第三个是用虚画刷填充饼形图。填充一个椭圆形图,第三个是用

27、虚画刷填充饼形图。#include#include#includelong WINAPI WndProcHWND hWnd,UINT iMessage,UINT wParam,LONG lParam;使用虚画刷填充时,看不出填充效果使用虚画刷填充时,看不出填充效果!四、四、应用实例应用实例BOOL InitWindowsClassHINSTANCE hInstance;BOOL InitWindowsHINSTANCE hInstance,int nCmdShow;HWND hWndMainint WINAPI WinMain/主函数主函数 HINSTANCE hInstance,HINSTA

28、NCE hPrevInstance,LPSTR lpCmdLine,int nCmdShowMSG Message;if!InitWindowsClasshInstancereturn FALSE;if!InitWindowshInstance,nCmdShowreturn FALSE;whileGetMessage&Message,0,0,0/消息循环消息循环 TranslateMessage&Message;DispatchMessage&Message;return Message.wParam;long WINAPI WndProclong WINAPI WndProcHWND hWn

29、d,UINT iMessage,HWND hWnd,UINT iMessage,UINT wParam,LONG lParamUINT wParam,LONG lParam HDC hDC;/定义指向设备的句柄定义指向设备的句柄 HBRUSH hBrush;/定义指向画刷的句柄定义指向画刷的句柄 HPEN hPen;/定义指向画笔的句柄定义指向画笔的句柄 PAINTSTRUCT PtStr;/定义指向包含绘图信息的结构体变量定义指向包含绘图信息的结构体变量消息处理函数switchiMessage /处理消息处理消息case WM_PAINT:/处理绘图消息处理绘图消息 hDC=BeginPai

30、nthWnd,&PtStr;SetMapModehDC,MM_ANISOTROPIC;/设置映像模设置映像模式式 hPen=HPENGetStockObjectBLACK_PEN;/黑色画笔黑色画笔 hBrush=HBRUSHGetStockObjectDKGRAY_BRUSH;/画刷画刷 SelectObjecthDC,hBrush;/选择画刷选择画刷 SelectObjecthDC,hPen;/选择画笔选择画笔 RoundRecthDC,50,120,100,200,15,15;/绘制圆角矩形绘制圆角矩形 hBrush=HBRUSHGetStockObjectLTGRAY_BRUSH;/采

31、用亮灰色画刷采用亮灰色画刷下面只改变下面只改变画刷,不改画刷,不改变笔变笔 SelectObjecthDC,hBrush;/选择画刷选择画刷 EllipsehDC,150,50,200,150;/绘制椭圆绘制椭圆 hBrush=HBRUSHGetStockObjectHOLLOW_BRUSH;/虚画刷虚画刷 SelectObjecthDC,hBrush;/选择画刷选择画刷 PiehDC,250,50,300,100,250,50,300,50;/绘制饼形绘制饼形 EndPainthWnd,&PtStr;/结束绘图结束绘图 return 0;case WM_DESTROY:case WM_DES

32、TROY:/结束应用程序结束应用程序PostQuitMessagePostQuitMessage0 0;return 0;return 0;default:default:/其他消息处理程序其他消息处理程序returnreturnDefWindowProcDefWindowProchWnd,iMessage,wParam,lParamhWnd,iMessage,wParam,lParam;BOOL InitWindowsBOOL InitWindowsHINSTANCE hInstance,int nCmdShowHINSTANCE hInstance,int nCmdShow/初始化窗口初始

33、化窗口 HWND hWnd;HWND hWnd;hWnd=CreateWindowhWnd=CreateWindowWinFill,/WinFill,/生成窗口生成窗口 填充例如程序填充例如程序,WS_OVERLAPPEDWINDOW,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,0,0,CW_USEDEFAULT,CW_USEDEFAULT,0,0,NULL,NULL,NULL,NULL,hInstance,hInstance,NULL NULL;if if!hWnd!hWnd return FALSE;return FALSE;hWndMa

34、in=hWnd;hWndMain=hWnd;ShowWindow ShowWindowhWnd,nCmdShowhWnd,nCmdShow;/显示窗口显示窗口 UpdateWindow UpdateWindowhWndhWnd;return TRUE;return TRUE;BOOL InitWindowsClassBOOL InitWindowsClassHINSTANCE hInstanceHINSTANCE hInstance/定义窗口类定义窗口类 WNDCLASS WndClass;WNDCLASS WndClass;WndClass.cbClsExtra=0;WndClass.cbC

35、lsExtra=0;WndClass.cbWndExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=WndClass.hbrBackground=HBRUSHHBRUSHGetStockObjectGetStockObjectWHITE_BRUSHWHITE_BRUSH;WndClass.hCursor=LoadCursor WndClass.hCursor=LoadCursorNULL,IDC_ARROWNULL,IDC_ARROW;WndClass.hIcon=LoadIcon WndClass.hIcon=LoadIconNULL,E

36、NDNULL,END;WndClass.hInstance=hInstance;WndClass.hInstance=hInstance;WndClass.lpfnWndProc=WndProc;WndClass.lpfnWndProc=WndProc;WndClass.lpszClassName=WinFill;WndClass.lpszClassName=WinFill;WndClass.lpszMenuName=NULL;WndClass.lpszMenuName=NULL;WndClass.style=CS_HREDRAW|CS_VREDRAW;WndClass.style=CS_HR

37、EDRAW|CS_VREDRAW;return RegisterClass return RegisterClass&WndClass&WndClass;例:例:应用画笔和画刷等工具绘制如下图的图形。应用画笔和画刷等工具绘制如下图的图形。1#include2#include3#include4 long WINAPI WndProcHWND hWnd,UINT iMessage,UINT wParam,LONG lParam;5 BOOL InitWindowsClassHINSTANCE hInstance;6 BOOL InitWindowsHINSTANCE hInstance,int

38、nCmdShow;7 HWND hWndMain;/主函数主函数8 int WINAPI WinMainHINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow9 MSG Message;10if!InitWindowsClasshInstancereturn FALSE;11if!InitWindowshInstance,nCmdShowreturn FALSE;12whileGetMessage&Message,0,0,0/消息循环消息循环13TranslateMessage&Message;14Dis

39、patchMessage&Message;15return Message.wParam;long WINAPI WndProcHWND hWnd,UINT iMessage,UINT wParam,LONG lParam1 HDC hDC;/定义设备环境句柄定义设备环境句柄2 HBRUSH hBrush;/定义画刷的句柄定义画刷的句柄3 HPEN hPen;/定义画笔的句柄定义画笔的句柄4 PAINTSTRUCT PtStr;/定义指向包含绘图信息的结构体变量定义指向包含绘图信息的结构体变量/定义一个定义一个POINT数组,包括数组,包括6个点个点 5 POINT points6=100,2

40、12,70,227,70,250,130,250,130,227,100,212;6 switchiMessage /处理消息处理消息 7 case WM_PAINT:/处理绘图消息处理绘图消息 8 hDC=BeginPainthWnd,&PtStr;9hPen=HPENGetStockObjectNULL_PEN;/获取系统定义的空画笔获取系统定义的空画笔10SelectObjecthDC,hPen;/选择画笔选择画笔11hBrush=HBRUSHGetStockObjectBLACK_BRUSH;/获取系统定义的画刷获取系统定义的画刷12SelectObjecthDC,hBrush;/选择

41、画刷选择画刷13LineTohDC,50,50;/画线画线14DeleteObjecthPen;/删除画笔删除画笔15hPen=CreatePenPS_SOLID,2,RGB255,0,0;/创立画笔创立画笔16SelectObjecthDC,hPen;/选择画笔选择画笔/画一个三角形画一个三角形17LineTohDC,150,50;18LineTohDC,100,137;19LineTohDC,50,50;1 PolylinehDC,points,6;/画一个五边形画一个五边形2ArchDC,63,137,138,212,100,137,100,137;/画一个画一个圆圆3PiehDC,21

42、3,137,288,212,240,137,260,137;/画一个画一个圆饼圆饼4RectanglehDC,213,212,287,250;/画一个长方形画一个长方形5RoundRecthDC,213,100,287,137,20,20;/画一个圆角长画一个圆角长方形方形6DeleteObjecthPen;/删除画笔删除画笔7DeleteObjecthBrush;/删除画刷删除画刷8EndPainthWnd,&PtStr;/结束绘图结束绘图9return 0;10case WM_DESTROY:/结束应用程序结束应用程序11PostQuitMessage0;12return 0;13defa

43、ult:/其他消息处理程序其他消息处理程序14returnDefWindowProchWnd,iMessage,wParam,lParam;BOOL InitWindowsHINSTANCE hInstance,int nCmdShow/初始化窗口初始化窗口HWND hWnd;hWnd=CreateWindowWinFill,/生成窗口生成窗口填充例如程序填充例如程序,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL;if!hWndreturn FALSE;hWndMain=hWnd;Sho

44、wWindowhWnd,nCmdShow;/显示窗口显示窗口UpdateWindowhWnd;return TRUE;BOOL InitWindowsClassHINSTANCE hInstance/定义窗口类定义窗口类WNDCLASS WndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=HBRUSHGetStockObjectWHITE_BRUSH;WndClass.hCursor=LoadCursorNULL,IDC_ARROW;WndClass.hIcon=LoadIconNULL,END

45、;WndClass.hInstance=hInstance;WndClass.lpfnWndProc=WndProc;WndClass.lpszClassName=WinFill;WndClass.lpszMenuName=NULL;WndClass.style=CS_HREDRAW|CS_VREDRAW;return RegisterClass&WndClass;【例【例4-2】编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动的实心圆,而且,每隔四分之一周期,圆的填充色和圆的迹移动的实心圆,而且,每隔四分之一周期,圆的填充色和圆的周边颜色都发

46、生变化,同时,圆的半径在四分之一周期之内由正周边颜色都发生变化,同时,圆的半径在四分之一周期之内由正弦曲线幅值的弦曲线幅值的0.20.2倍至倍至0.60.6倍线性增长。倍线性增长。1 1 正弦曲线是此题的基础。在正弦曲线是此题的基础。在WndMainWndMain函数消息循环函数消息循环前,生成正弦曲线各点的坐标。把正弦曲线一个周期的横坐标前,生成正弦曲线各点的坐标。把正弦曲线一个周期的横坐标分成分成100100个等分点,存储在数组个等分点,存储在数组lpSin100lpSin100中,中,100100个点的坐标个点的坐标计算如下:计算如下:forforint j=0;j100;j+int j

47、=0;j100;j+/生成正弦曲线的点坐标生成正弦曲线的点坐标 lpSinj.x=lpSinj.x=longlongj*2*Pi/100*60j*2*Pi/100*60;lpSinj.y=lpSinj.y=longlongdfRange*sindfRange*sinj*2*Pi/100j*2*Pi/100;双击此处运行程序双击此处运行程序2 2 动态显示圆在正弦曲线上移动动态显示圆在正弦曲线上移动数组数组lpSin100lpSin100的长度为的长度为100100设定圆在正弦曲线移动时共有设定圆在正弦曲线移动时共有100100个位置个位置数组中每一个值是圆移动时圆心的坐标数组中每一个值是圆移动

48、时圆心的坐标每四分之一周期有每四分之一周期有2525个位置个位置i=25i=25处于第处于第1 1个个1/41/4周期,创立红色画笔和画刷;周期,创立红色画笔和画刷;25i5025i50处于第处于第2 2个个1/41/4周期,创立绿色画笔和画刷;周期,创立绿色画笔和画刷;50i7550i75处于第处于第3 3个个1/41/4周期,创立蓝色画笔和画刷;周期,创立蓝色画笔和画刷;75i10075i100处于第处于第4 4个个1/41/4周期,创立黄色画笔和画刷;周期,创立黄色画笔和画刷;if ifi=25i=25 /第一个第一个1/41/4周期周期 hPen=CreatePen hPen=Crea

49、tePenPS_DASH,1,RGBPS_DASH,1,RGB255,0,0255,0,0;hBrush=CreateHatchBrush hBrush=CreateHatchBrushHS_BDIAGONAL,RGBHS_BDIAGONAL,RGB255,0,0255,0,0;lRadious=lRadious=longlongdfRange*0.2+i%25*dfRange*0.4/25dfRange*0.2+i%25*dfRange*0.4/25;/;/计算半径计算半径 在消息在消息WM_PAINTWM_PAINT处理程序中,调用函数处理程序中,调用函数BeginPaintBeginPa

50、int获获得设备环境句柄。由此经过线性差分计算圆半径的大小得设备环境句柄。由此经过线性差分计算圆半径的大小lRadiouslRadious,第,第1 1个个1/41/4周期的程序代码如下:周期的程序代码如下:创立的画笔和画刷选入设备环境后,调用函数创立的画笔和画刷选入设备环境后,调用函数EllipseEllipse绘绘制圆形。下面这段代码是动态显示的关键:制圆形。下面这段代码是动态显示的关键:SleepSleep100100;/停停0.10.1秒秒ififi100i100 InvalidateRect InvalidateRecthWnd,NULL,1hWnd,NULL,1;/;/刷新用刷新用

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com