资源预览内容
第1页 / 共52页
第2页 / 共52页
第3页 / 共52页
第4页 / 共52页
第5页 / 共52页
第6页 / 共52页
第7页 / 共52页
第8页 / 共52页
第9页 / 共52页
第10页 / 共52页
亲,该文档总共52页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第3 3讲讲 Windows Windows的图形设备接口及的图形设备接口及windowswindows绘图绘图 Windows图形设备接口图形设备接口(GDI)是为与)是为与设备无关设备无关的图形的图形设计的。所谓设备的无关性,就是操作系统屏蔽了硬件设设计的。所谓设备的无关性,就是操作系统屏蔽了硬件设备的差异,因而设备无关性能使用户编程时无需考虑特殊备的差异,因而设备无关性能使用户编程时无需考虑特殊的硬件设置的硬件设置一、图形设备按口一、图形设备按口(GDI)(GDI)GDI负责系统与用户或绘图程序之间的信息交换,并控制在输出设备负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上上显示图形显示图形或或文字文字, 是是Windows系统的重要组成部分系统的重要组成部分Windows支持与设备无关的图形支持与设备无关的图形利用利用GDI和和Windows设设备驱动程序备驱动程序开发人员只要建开发人员只要建立与输出设备的立与输出设备的关联,让系统加关联,让系统加载相应的设备驱载相应的设备驱动程序即可动程序即可胀楔陷粒三扛尚贞蕾纱柯炔邱卫年冀决叛硕沧躇夜扮憎傲惩栗迂亿明药娘第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图11. 1. GDI的一些基本概念的一些基本概念 设备描述表设备描述表即为即为设备环境设备环境的属性的集合的属性的集合应用程序应用程序与与输出设备输出设备之之间的桥梁间的桥梁Win系统系统外设外设直接访问直接访问不允许不允许统一的设备环境统一的设备环境(DC)提供提供使应用程序与设备相连使应用程序与设备相连用用户户为确保图形输出的为确保图形输出的设备无关性设备无关性狮愉着潮脓此昧凤振讲甜犹冰狮铜獭立趋映肇乎月先逞赁注慰殿非摔巍燎第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图2应用应用程序程序设备描设备描述表及述表及其属性其属性通过设备描述表的句柄来间接地存取通过设备描述表的句柄来间接地存取应用程序每一次图形操应用程序每一次图形操作均参照设备描述表中作均参照设备描述表中的属性执行的属性执行吟审葡诚著愁暴镭臭险听迂吴懊莲纸卵烟干慑秤霹带菲剖凸垮贵堡打洛拆第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图32.2.图形刷新图形刷新图形刷新图形刷新是绘图过程中必须考虑的重要问题是绘图过程中必须考虑的重要问题刷新请求刷新请求对刷新请求的响应对刷新请求的响应刷新方法刷新方法包括(1) 刷新请求刷新请求 应用程序在窗口中应用程序在窗口中绘制了一个椭圆,绘制了一个椭圆,颜色列表框覆盖了颜色列表框覆盖了椭圆的一部分椭圆的一部分关闭颜色选框后,关闭颜色选框后,应用程序需要恢应用程序需要恢复被覆盖部分的复被覆盖部分的颜色和形状颜色和形状窗口大小的调整窗口大小的调整窗口移动窗口移动被覆盖后的恢复被覆盖后的恢复惊蓖秃宙枣造找寿循施滇躬娱烫孽泄滦邹口委烁矗揽余桐奋搅亨吟屈畔耿第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图4(2) 系统对刷新请求的响应系统对刷新请求的响应 当用户区的内容需要刷新时,系统向应用程序消息队当用户区的内容需要刷新时,系统向应用程序消息队列发送列发送WM_PAINT消息,系统在应用程序的消息队列中消息,系统在应用程序的消息队列中加入该消息,以通知窗口函数执行刷新处理加入该消息,以通知窗口函数执行刷新处理三种三种刷新刷新窗口移动后的刷新窗口移动后的刷新被覆盖区域的刷新被覆盖区域的刷新对象穿越后的刷新对象穿越后的刷新(系统自动完成)用户区移动或显示用户区移动或显示用户窗口大小改变用户窗口大小改变程序通过滚动条滚动窗口程序通过滚动条滚动窗口窗口被另一个窗口覆盖的窗口被另一个窗口覆盖的恢复如下拉式菜单关闭等恢复如下拉式菜单关闭等光标穿过用户区光标穿过用户区图标拖过用户区图标拖过用户区赃饺劈阜鞠旷堑苏鹰糖滩袁箍型半瘸癌存姿甸愈吼漳侈福诚项诲蔚烦跺刚第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图5窗口被另一个窗口覆盖的区域称为窗口被另一个窗口覆盖的区域称为无效区域无效区域。 Windows系统为每个窗口建立了一个系统为每个窗口建立了一个PAINTSTRUCT结构结构,该结构该结构中包含了包围中包含了包围无效区域无效区域的一个最小矩形的结构的一个最小矩形的结构RECT,应用程序可以根应用程序可以根据这个无效矩形执行刷新操作。据这个无效矩形执行刷新操作。 Typedef struct tagPAINTSTRUCTTypedef struct tagPAINTSTRUCT HDC hdc; HDC hdc;/设备环境句柄设备环境句柄 BOOL fErase;BOOL fErase;/一般取真值,表示擦除无效矩形的背景一般取真值,表示擦除无效矩形的背景 RECT RECT rcPaintrcPaint; ;/无效矩形标识无效矩形标识 BOOL fRestore;BOOL fRestore;/系统保留系统保留 BOOL fIncUpdate; BOOL fIncUpdate;/系统保留系统保留 BYTE rgbReserved16BYTE rgbReserved16;/系统保留系统保留 PAINTSTRUCT; PAINTSTRUCT;rcPaint 为标准的为标准的RECT数据结构,其数据结构,其作用是标识无效矩形,它包含了无效矩作用是标识无效矩形,它包含了无效矩形的左上角和右下角的坐标形的左上角和右下角的坐标映酉贷破扎蔫驭夫拱湖双啦夏族基劝豌昼秘殴骡穷加锈本铸露议吴随诅贷第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图6常用的常用的Windows应用程序刷新窗应用程序刷新窗口的方法口的方法保存副本。刷保存副本。刷新时将副本拷新时将副本拷贝到相应的窗贝到相应的窗口中口中记录事件。刷新时记录事件。刷新时重新执行这个曾经重新执行这个曾经发生的事件发生的事件重新绘制。将图形绘重新绘制。将图形绘制处理程序放在消息制处理程序放在消息WM_PAINT响应模响应模块中,刷新时重绘图块中,刷新时重绘图形形(3) 有效的刷新方法有效的刷新方法搅按成巨绳拧馁夜苹妄棕搜巡朱屿贿芹名馁融战就笋罕惺封铂奏市觉轮晤第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图73. 获取设备环境的方法获取设备环境的方法获取设备环境是应用程序输出图形的先决条件,常用的两种方法是调用获取设备环境是应用程序输出图形的先决条件,常用的两种方法是调用函数函数BeginPaint或或GetDC(1) 调用调用BeginPaint函数函数 应用程序响应应用程序响应WM_PAINT消息进行图形刷新时,主要通过调用消息进行图形刷新时,主要通过调用BeginPaint函数获取设备环境函数获取设备环境 hdc=BeginPaint(hwnd,&hdc=BeginPaint(hwnd,&psps) ); /psps为为PAINTSTRUCTPAINTSTRUCT类型结构类型结构定义方式为:定义方式为:PAINTSTRUCT PAINTSTRUCT ps;ps; 系统获取设备环境的系统获取设备环境的同时填写同时填写ps结构,以结构,以标识无效矩形区标识无效矩形区由由BeginPaint函数获取的设备环境要用函数获取的设备环境要用EndPaint函数释放函数释放void EndPaint(HWND hwnd, PAINTSTRUCT &ps)舔栗傣望虱编旱旋侦咨勺韧砷肌广赌埔物侣馋说镑辰辽四洲墙脯壶毫擎厅第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图8(2) 调用调用GetDC函数函数 如果绘图工作并非由如果绘图工作并非由WM_PAINT消息驱动,则调用消息驱动,则调用GetDC函数获函数获取设备环境。取设备环境。hdc=GetDC(hwnd);hdc=GetDC(hwnd); 由由GetDC函数获取的设备环境必须用函数获取的设备环境必须用ReleaseDC函数释放函数释放 void ReleaseDC(HWND hwnd);综垫笼抛通吻漆苛襟捡拖细捷且淬见忙杖枫走涯孕烹浦碰颁莉刮殷漓馈盲第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图94. 映像模式映像模式映像模式定义了将逻辑单位转化为设备的度量单位以及设备的映像模式定义了将逻辑单位转化为设备的度量单位以及设备的x方向和方向和y方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况输出设备的坐标系情况窗口窗口:对应逻辑坐标系上程序员设定的区域:对应逻辑坐标系上程序员设定的区域视口视口:对应实际输出设备上程序员设定的区域:对应实际输出设备上程序员设定的区域窗口和视口窗口和视口如何映射?如何映射?坞孕忘钝盂懊羌逃场撞素跑烟平徊伙则顽姚颜推鸯羊幼厄唐被颈辜驶礼姐第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图10缺省的映射模式缺省的映射模式将窗口中的对称将窗口中的对称图形映射到视口图形映射到视口时仍为对称图形时仍为对称图形按照窗口和视口的坐按照窗口和视口的坐标比例进行映射标比例进行映射坐标坐标系统系统逻辑坐标系统逻辑坐标系统设备坐标系统设备坐标系统屏幕坐标系统屏幕坐标系统窗口坐标系统窗口坐标系统用户区坐标系统用户区坐标系统蛛疽国具功虏六嘛嫩玄锯凿畸敛介郝免掷七囤波袄亥俩坪攫咋煤虞购挪酵第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图11 应用程序可获取设备环境的当前映像模式,并根据需要设置映像应用程序可获取设备环境的当前映像模式,并根据需要设置映像模式。模式。相关相关函数函数设置设备环境的映像模式设置设备环境的映像模式SetMapMode(hdc,nMapMode);SetMapMode(hdc,nMapMode); nMapMode为映像模式的整型标识符为映像模式的整型标识符获取当前设备环境的映像模式获取当前设备环境的映像模式nMapMode=GetMapMode(hdc);nMapMode=GetMapMode(hdc);奖落批盛啡粱午消讫瞪卖雄恼淖吭掉铂逻啦贝封纲学老你淌条故撅庚漏绍第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图12窗口窗口区域的定义由区域的定义由SetWindowExtEx函数完成,其函数原型形为函数完成,其函数原型形为:BOOL SetWindowExtExBOOL SetWindowExtEx( HDC hdc,( HDC hdc, int nHeight,nWidth int nHeight,nWidth, / /以以逻辑逻辑单位表示的窗口区域高宽度单位表示的窗口区域高宽度 LPSIZE lpSize LPSIZE lpSize, / /函数调用前窗口区域尺寸的函数调用前窗口区域尺寸的SIZESIZE结构地址结构地址););视口视口区域的定义由区域的定义由SetViewportExtEx函数完成,函数原型为:函数完成,函数原型为:BOOL Set ViewportExtEx ViewportExtEx( (HDC hdc,HDC hdc,int nHeight,nWidth,/int nHeight,nWidth,/以以物理物理设备单位表示的新视口区域高宽度设备单位表示的新视口区域高宽度LPSIZE lpSizeLPSIZE lpSize);只有在映射模式为只有在映射模式为MM_ANISOTROPIC和和MM_ISOTROPIC时才有意义时才有意义徽杠猾颇著硅蚀鲜怠册雁栋樱恢驻潍藏胶译钙盗藐饰习查咽谤兄骏透玄况第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图13视口视口的缺省原点和的缺省原点和窗口窗口的缺省原点均为(的缺省原点均为(0,0)。可通过调用函数)。可通过调用函数SetViewportOrgEx和和SetWindowOrgEx设定窗口与视口的原点。设定窗口与视口的原点。SetWindowOrgEx函数的原形为函数的原形为:BOOL SetWindowOrgExBOOL SetWindowOrgEx( (HDC hdc,HDC hdc,int X,Yint X,Y,/以以逻辑逻辑单位表示的窗口原点坐标单位表示的窗口原点坐标LPPOINT lpPointLPPOINT lpPoint/函数调用前原点坐标的函数调用前原点坐标的POINTPOINT结构的地址结构的地址););只有在映射模式为只有在映射模式为MM_ANISOTROPIC和和MM_ISOTROPIC时才有意义时才有意义番帅友橇相盼概闷涵拇肪抄乡屿秉钱罩日香挥沸世揽尽屏邹貌舔罢滑砷豁第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图14二、绘图工具与颜色二、绘图工具与颜色1. 画笔画笔(1) 画笔的创建画笔的创建 使用画笔之前必须事先定义一个画笔句柄。形式如下使用画笔之前必须事先定义一个画笔句柄。形式如下:HPEN hP;然后调用函数然后调用函数GetStockObject获取获取Windows系统定义的系统定义的四种四种画笔例如画笔例如获取画笔获取画笔BLACK_PEN的形式如下的形式如下: hP=hP=GetStockObjectGetStockObject(BLACK_PENBLACK_PEN); ;WHITE_PENBLACK_PENDC_PENNULL_PEN画笔的操作画笔的操作创建画笔创建画笔将画笔选入设备环境将画笔选入设备环境删除画笔删除画笔雌呸嚣仍妖搬疏吞荔广尊疏焰哦腊郧葛埂镶港退研叮腹杨惕咆训烷啸滥掂第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图15(2) 创建创建新新画笔,形式如下画笔,形式如下:hP=CreatePenhP=CreatePen(int nPenStyle,int nPenStyle,/确定确定画笔样式画笔样式int nWidth,int nWidth, /画笔宽度画笔宽度COLORREF rgbColor /COLORREF rgbColor /画笔颜色画笔颜色); ;创建画笔后,必须调用创建画笔后,必须调用SelectObject函数将其选入设备环境。函数将其选入设备环境。 SelectObject(hdc,hP);SelectObject(hdc,hP); /hP /hP为所创建或获取的画笔句柄为所创建或获取的画笔句柄不再使用当前画笔时,需删除画笔,以免占内存不再使用当前画笔时,需删除画笔,以免占内存 DeleteObject(hP); DeleteObject(hP);PS_DASH:虚线虚线PS_DASHDOT:点划线点划线PS_DASHDOTDOT:双点划线双点划线PS_DOT:点线点线PS_INSIDEFRAME:实线实线PS_NULL:无无PS_SOLID:实线实线弛渺腻算售仔悲软暮控廉于埃骸颖噶急猎徘酮耽傣染纷二怒籽郭腕行锣型第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图162. 画刷画刷 画刷的创建与应用与画笔很相似,画刷的创建与应用与画笔很相似,操作画刷也包括操作画刷也包括创建创建、选入设备选入设备环境环境和和删除删除。(1) 画刷的创建画刷的创建 使用画刷需事先定义一个画刷句柄。形式如下:使用画刷需事先定义一个画刷句柄。形式如下: HBRUSH hBr; /hBr为画刷句柄为画刷句柄 然后调用函数然后调用函数GetStockObject获取获取Windows系统提供的系统提供的7种画刷种画刷 hBr=(HBRUSH)GetStockObject(nBrushStylenBrushStyle)画刷样式)画刷样式BLACK_BRUSH黑色画刷黑色画刷DKGRAY_BRUSH 深灰色画刷深灰色画刷GRAY_BRUSH灰色画刷灰色画刷HOLLOW_BRUSH 虚画刷虚画刷LTGRAY_BRUSH亮灰色画刷亮灰色画刷NULL_BRUSH空画刷空画刷WHITE_BRUSH白色画刷白色画刷指定颜色画指定颜色画刷如何获得刷如何获得?儡蛤挺韩偶律秉邹厌氧扫鹃瘴羞确商杠凝尘熏倘柔踌早荧赎仰丫菏愿官募第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图17可调用函数可调用函数CreateSolidBrush和和CreateHatchBrush创建画刷创建画刷,hBr=CreateSolidBrush(rgbColor);hBr=CreateSolidBrush(rgbColor); 创建具有创建具有指定颜色指定颜色的单色画刷的单色画刷创建指定阴创建指定阴影图案和颜影图案和颜色的画刷色的画刷(2) 选入设备环境选入设备环境 创建画刷后,创建画刷后, 通过通过SelectObject(hdc,hBr););将其选入设备环境将其选入设备环境(3) 删除画刷删除画刷 不使用画刷时,可用不使用画刷时,可用DeleteObject(hBr);删除画刷,释放内存删除画刷,释放内存hBr=CreateHatchBrushhBr=CreateHatchBrush(int (int nHctchStylenHctchStyle, , COLORREF rgbColor COLORREF rgbColor););HS_BDIAGONAL 45度从左上到右下度从左上到右下HS_DIAGCROSS 45度叉线度叉线HS_FDIAGONAL 45度从左下到右上度从左下到右上HS_CROSS 垂直相交的阴影线垂直相交的阴影线HS_HORIZONTAL 水平阴影线水平阴影线HS_VERTICAL垂直阴影线垂直阴影线漱蛊隆扔雁返绵水千舷球燃胁剔抠荧越豹切惑默窄挖沿侮拾小屉均腔机捣第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图183. 颜色颜色 Windows使用宏使用宏RGB定义绘图的颜色,其形式为定义绘图的颜色,其形式为: RGB(nRed, nGreen,nBlue) 红色值红色值蓝色值蓝色值绿色值绿色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)效槐勺屁霄咨瘴瞥经盂珍击欠洼浴钦邹歼嫁詹肛况肮音科债惨吉夏瞧吟蛾第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图19三、三、 常用绘图函数常用绘图函数1设置画笔当前位置的函数设置画笔当前位置的函数MoveToEx, BOOL MoveToEx(HDC hdc, int X,Y,/ X、Y分别为新位置的逻辑坐标分别为新位置的逻辑坐标 LPPOINT lpPoint/存放原画笔位置的存放原画笔位置的POINT结构地址结构地址)2 从当前位置向指定坐标点画直线的函数从当前位置向指定坐标点画直线的函数LineToEx,BOOL BOOL LineToExLineToEx(HDC hdc,int X,int Y) /(HDC hdc,int X,int Y) /X X和和Y Y为线段的终点坐标为线段的终点坐标3 从当前位置开始,依次用线段连接从当前位置开始,依次用线段连接lpPoints中指定的各点中指定的各点BOOL Polyline ( HDC hdc, LPPOINT lpPoints, /指向包含各点坐标的指向包含各点坐标的POINT结构数组的指针结构数组的指针 int nCount / nCount为为POINT数组中点的个数数组中点的个数)忌露孵逾封缆侥涌攫盒菜锰看峪灿郊磊蓉宪涛姆置代纹煤薄兽恬铡腰苞赊第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图204 绘制椭圆弧线的函数绘制椭圆弧线的函数Arc,BOOL Arc(HDC hdc,int X1,intY1,/边框矩形左上角的逻辑坐标边框矩形左上角的逻辑坐标int X2,int Y2,/边框矩形右下角的逻辑坐标边框矩形右下角的逻辑坐标int X3,int Y3,/椭圆弧起始点坐标椭圆弧起始点坐标int X4,int Y4/椭圆弧终止点坐标椭圆弧终止点坐标) (x1,y1)(x2,y2)(x3,y3)(x4,y4)所画曲线所画曲线惊珍尉沛店纂铆绞廖岭目设早赎绣伦冉注唉杀图殷黍眷逝乓娘单掳孝淑掌第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图215 绘制饼图,并用当前画刷进行填充绘制饼图,并用当前画刷进行填充BOOL Pie(HDC hdc,int X1,intY1,/边框矩形左上角的逻辑坐标边框矩形左上角的逻辑坐标int X2,int Y2,/边框矩形右下角的逻辑坐标边框矩形右下角的逻辑坐标int X3,int Y3,/椭圆弧起始经线的确定点坐标椭圆弧起始经线的确定点坐标int X4,int Y4/椭圆弧终止经线的确定点坐标椭圆弧终止经线的确定点坐标)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所填区域所填区域记赋悼滥液驳妈长筐辞氟碴耳篷冠宁就乒砂柿直识削倾抽软梢嘎绞辈现蹈第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图226 绘制矩形,并用当前画刷进行填充绘制矩形,并用当前画刷进行填充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 绘制椭圆,并用当前画刷填充绘制椭圆,并用当前画刷填充 BOOL Ellipse(HDC hdc,intX1,intY1,intX2,intY2)9绘制多边形,并用当前画刷填充绘制多边形,并用当前画刷填充BOOL Polygon(HDC hdc,LPPOINT lpPoints,int nCount)包含各点坐标的包含各点坐标的POINT数组的地址数组的地址多边形点的个数多边形点的个数桅引奉蓝烽立火案攫贤走绢捍粘低破鼻落糙母酒神炒诚陵养线亥摔听哟斥第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图23四、四、 应用实例应用实例【例【例3-1】利用绘图函数创建填充区。共有三个填充图形,第一个是用】利用绘图函数创建填充区。共有三个填充图形,第一个是用深灰色画刷填充带圆角的矩形,第二个是采用亮灰色画刷填充一个椭深灰色画刷填充带圆角的矩形,第二个是采用亮灰色画刷填充一个椭圆型图,第三个是用虚画刷填充饼形图。圆型图,第三个是用虚画刷填充饼形图。#include#include#includelong WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam););使用虚画刷填充时,看不出填充效果使用虚画刷填充时,看不出填充效果!袱烛炯锋揭池承庭瞪温绍饶等阿右桨鉴丧勾串仟枪凄殖秽姨铃沧霖铁翰秧第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图24BOOL InitWindowsClass(HINSTANCE hInstance);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);HWND hWndMainint WINAPI WinMain/主函数主函数( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)MSG Message;if(!InitWindowsClass(hInstance)return FALSE;if(!InitWindows(hInstance,nCmdShow) return FALSE;while(GetMessage(&Message,0,0,0)/消息循环消息循环 TranslateMessage(&Message);DispatchMessage(&Message); return Message.wParam;辐化意绪稼嫌绷型令痰属椭咬容冒优宏耻款劫淫碉盅浓细氖论导镐魂潮蜡第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图25long WINAPI long WINAPI WndProcWndProc(HWND hWnd,UINT iMessage,(HWND hWnd,UINT iMessage, UINT wParam,LONG lParam) UINT wParam,LONG lParam) HDC hDC; /定义指向设备的句柄定义指向设备的句柄 HBRUSH hBrush; /定义指向画刷的句柄定义指向画刷的句柄 HPEN hPen;/定义指向画笔的句柄定义指向画笔的句柄 PAINTSTRUCT PtStr;/定义指向包含绘图信息的结构体变量定义指向包含绘图信息的结构体变量消息处理函数switch(iMessage) /处理消息处理消息case WM_PAINT: /处理绘图消息处理绘图消息 hDC=BeginPaint(hWnd,&PtStr); SetMapMode(hDC,MM_ANISOTROPIC); /设置映像模式设置映像模式 hPen=(HPEN)GetStockObject(BLACK_PEN); /黑色画笔黑色画笔 hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH); /画刷画刷 SelectObject(hDC,hBrush); /选择画刷选择画刷 SelectObject(hDC,hPen); /选择画笔选择画笔 RoundRect(hDC,50,120,100,200,15,15); /绘制圆角矩形绘制圆角矩形 hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); /采用亮灰色采用亮灰色画刷画刷下面只改变画下面只改变画刷,不改变笔刷,不改变笔团桓罕驰毛句王攘乓曳噬攒申拎耪泥宁持辜汹肤置喝平躇拐疾慕罗任推厨第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图26 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,&PtStr); /结束绘图结束绘图 return 0;case WM_DESTROY:case WM_DESTROY: /结束应用程序结束应用程序PostQuitMessage(0); return 0;PostQuitMessage(0); return 0;default:default:/其他消息处理程序其他消息处理程序return(DefWindowProc(hWnd,iMessage,wParam,lParam) ;return(DefWindowProc(hWnd,iMessage,wParam,lParam) ; 轻哥膝锤谈茶抡镜弓琴见纠秒匙死议肖献疙磨选学存仰慌黑盐熔简骸忠婆第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图27BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)/BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)/初始化窗口初始化窗口 HWND hWnd;HWND hWnd;hWnd=CreateWindow(WinFill, /hWnd=CreateWindow(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(!hWnd)if(!hWnd)return FALSE;return FALSE; hWndMain=hWnd; hWndMain=hWnd; ShowWindow(hWnd,nCmdShow); ShowWindow(hWnd,nCmdShow);/显示窗口显示窗口 UpdateWindow(hWnd); UpdateWindow(hWnd); return TRUE; return TRUE; 考质详叭纫尉唇哥植患掣站蜡毫菩辰了孙闻迪匡谆探蘑氏辫购辑捷败呸耀第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图28BOOL InitWindowsClass(HINSTANCE hInstance)BOOL InitWindowsClass(HINSTANCE hInstance)/定义窗口类定义窗口类 WNDCLASS WndClass; WNDCLASS WndClass; WndClass.cbClsExtra=0; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH); WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,END); WndClass.hIcon=LoadIcon(NULL,END); WndClass.hInstance=hInstance; WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName= WndClass.lpszClassName=WinFillWinFill; WndClass.lpszMenuName=NULL; WndClass.lpszMenuName=NULL; WndClass.CS_HREDRAW|CS_VREDRAW; WndClass.CS_HREDRAW|CS_VREDRAW; return RegisterClass(&WndClass); return RegisterClass(&WndClass); 镣舆饶自察苑狠全煞甩吕嘲对铆拘皱煮臃溜篮奶倘睛意宾缀朱嫂裤魔羽冈第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图29例:例: 应用画笔和画刷等工具绘制如图所示的图形应用画笔和画刷等工具绘制如图所示的图形呕撰捌慕凹分菊恐映碑哗缴闷砖芥该哇庸藻灼副算柞犹酪浓崎伤沼少咳趾第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图301 #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 WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)9 MSG Message;10if(!InitWindowsClass(hInstance)return FALSE;11if(!InitWindows(hInstance,nCmdShow)return FALSE;12while(GetMessage(&Message,0,0,0)/消息循环消息循环13TranslateMessage(&Message);14DispatchMessage(&Message); 15return Message.wParam;船稀哥娠剪洒锋比鹊赤犊荡瞎剑启琉弓蔫身瞩教手跪奴痛浸颁蛾子根蕾呵第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图31long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)1 HDC hDC; /定义设备环境句柄定义设备环境句柄2 HBRUSH hBrush; /定义画刷的句柄定义画刷的句柄3 HPEN hPen;/定义画笔的句柄定义画笔的句柄4 PAINTSTRUCT PtStr; /定义指向包含绘图信息的结构体变量定义指向包含绘图信息的结构体变量 /定义一个定义一个POINT数组,包括数组,包括6个点个点 5 POINT points6=100,212,70,227,70,250,130,250,130,227,100,212; 6 switch(iMessage) /处理消息处理消息 7 case WM_PAINT: /处理绘图消息处理绘图消息 8 hDC=BeginPaint(hWnd,&PtStr);9hPen=(HPEN)GetStockObject(NULL_PEN); /获取系统定义的空画笔获取系统定义的空画笔10SelectObject(hDC,hPen); /选择画笔选择画笔11hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); /获取系统定义的画刷获取系统定义的画刷12SelectObject(hDC,hBrush); /选择画刷选择画刷13LineTo(hDC,50,50); /画线画线14DeleteObject(hPen); /删除画笔删除画笔15hPen=CreatePen(PS_SOLID,2,RGB(255,0,0); /创建画笔创建画笔16SelectObject(hDC,hPen); /选择画笔选择画笔/画一个三角形画一个三角形17LineTo(hDC,150,50);18LineTo(hDC,100,137);19LineTo(hDC,50,50);凌帅购戊翰解酥著痰宦扑蜒皱熄娶娩贩低吠油烈晚就辞群共谨瑶员葱免贩第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图321 Polyline(hDC,points,6); /画一个五边形画一个五边形2Arc(hDC,63,137,138,212,100,137,100,137); /画一个圆画一个圆3Pie(hDC,213,137,288,212,240,137,260,137); /画一个圆饼画一个圆饼4Rectangle(hDC,213,212,287,250); /画一个长方形画一个长方形5RoundRect(hDC,213,100,287,137,20,20); /画一个圆角长方形画一个圆角长方形6DeleteObject(hPen); /删除画笔删除画笔7DeleteObject(hBrush); /删除画刷删除画刷8EndPaint(hWnd,&PtStr); /结束绘图结束绘图9return 0;10case WM_DESTROY: /结束应用程序结束应用程序11PostQuitMessage(0);12return 0;13default:/其他消息处理程序其他消息处理程序14return(DefWindowProc(hWnd,iMessage,wParam,lParam) ; 疼纳料胃届预蹋滴让吕霞炕凯啤灸足较寸诌肢狞已组霍避迎格燎付苯真愈第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图33BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) /初始化窗口初始化窗口HWND hWnd;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;斜痰耘您棵许馏蛔亦皱鸟耐层沛蛇逢初填处宗带婉曹至仗粮伟蔓煞洞谊藉第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图34BOOL InitWindowsClass(HINSTANCE hInstance) /定义窗口类定义窗口类WNDCLASS WndClass; WndClass.cbClsExtra=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.CS_HREDRAW|CS_VREDRAW; return RegisterClass(&WndClass);罚陀端渺丝茸催廊捅习各傍伶夫娱侠恰剩陨断宗剖朋妖戌箩庄墓办成悔曾第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图35【例【例4-2】编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动的实心圆,而且,每隔四分之一周期,圆的填充色和圆的周边颜色都的实心圆,而且,每隔四分之一周期,圆的填充色和圆的周边颜色都发生变化,同时,圆的半径在四分之一周期之内由正弦曲线幅值的发生变化,同时,圆的半径在四分之一周期之内由正弦曲线幅值的0.20.2倍至倍至0.60.6倍线性增长。倍线性增长。(1) (1) 正弦曲线是此题的基础。在正弦曲线是此题的基础。在WndMain()WndMain()函数消息循环前,生成正函数消息循环前,生成正弦曲线各点的坐标。把正弦曲线一个周期的横坐标分成弦曲线各点的坐标。把正弦曲线一个周期的横坐标分成100100个等分点,个等分点,存储在数组存储在数组lpSin100lpSin100中,中,100100个点的坐标计算如下:个点的坐标计算如下:for(int j=0;j100;j+)for(int j=0;j100;j+)/生成正弦曲线的点坐标生成正弦曲线的点坐标 lpSinj.x=(long)(j*2*Pi/100*60);lpSinj.x=(long)(j*2*Pi/100*60);lpSinj.y=(long)(dfRange*sin(j*2*Pi/100);lpSinj.y=(long)(dfRange*sin(j*2*Pi/100); 双击此处运行程序双击此处运行程序巡号蚊隧讶泞绒些穗程裴伟龟忆伎窟喊前衔锗赴劣很骆由揩午爱廓洱狞醚第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图36(2) (2) 动态显示圆在正弦曲线上移动动态显示圆在正弦曲线上移动数组数组lpSin100lpSin100的长度为的长度为100100设定圆在正弦曲线移动时共有设定圆在正弦曲线移动时共有100100个位置个位置数组中每一个值是圆移动时圆心的坐标数组中每一个值是圆移动时圆心的坐标每四分之一周期有每四分之一周期有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周期,创建周期,创建黄色画笔和画刷黄色画笔和画刷;彬翁厕怀胰姑狗再极阳蘸孕邓歪晋陡束闷摇朔党豪霓员刚势第情止假在姻第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图37 if(i=25) if(i=25) /第一个第一个1/41/4周期周期 hPen=CreatePen(PS_DASH,1,RGB(255,0,0); hPen=CreatePen(PS_DASH,1,RGB(255,0,0); hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0); hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);/ lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);/计算半径计算半径 在消息在消息WM_PAINTWM_PAINT处理程序中,调用函数处理程序中,调用函数BeginPaint()BeginPaint()获得设备获得设备环境句柄。由此经过线性差分计算圆半径的大小环境句柄。由此经过线性差分计算圆半径的大小lRadiouslRadious,第,第1 1个个1/41/4周期的程序代码如下:周期的程序代码如下:湖探托途霖捂白跋浦瞄昏处句邻栓窖剂承肇菱蚜衷扬文侯绷氮认虞栅搏嚷第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图38创建的画笔和画刷选入设备环境后,调用函数创建的画笔和画刷选入设备环境后,调用函数Ellipse()Ellipse()绘制圆形下绘制圆形下面这段代码是动态显示的关键:面这段代码是动态显示的关键:Sleep(100);Sleep(100);/停停0.10.1秒秒if(i100) InvalidateRect(hWnd,NULL,1);/if(i100) InvalidateRect(hWnd,NULL,1);/刷新用户区刷新用户区 调用调用Sleep(100)Sleep(100)函数使程序暂停函数使程序暂停0.10.1秒。所含参数秒。所含参数100100代表暂停的代表暂停的时间,使用毫秒作单位。时间,使用毫秒作单位。i100i100时调用函数刷新用户时调用函数刷新用户区发送区发送WM_PAINTWM_PAINT消息消息消息发到的消息发到的窗口的句柄窗口的句柄代表刷新代表刷新整个用户区整个用户区代表清除用户区中代表清除用户区中所有的显示内容所有的显示内容焊类南披店争险秆支掘炳康套冉善射腾回括诣憨嘎多汤辽猖午脊硬主曳兼第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图39#include #include #include #include #define Pi 3.1415926long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);double dfTheta=0,dfRange=100.0;/正弦曲线的角度变量正弦曲线的角度变量.long i=0,j=0;long lCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange);/定义圆心坐标和圆半径定义圆心坐标和圆半径.POINT lpSin100;/定义正弦曲线的点坐标定义正弦曲线的点坐标.int WINAPI WinMain(,.) / 填写窗口类属性填写窗口类属性if(!RegisterClass(&WndClass)/注册窗口注册窗口.MessageBeep(0);return FALSE;刀覆黑丑焚蛆息播蛹业驾贮护潭碟樱贤根卵差匠席杜民钓弊咯老焊佣玉畏第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图40hWnd=CreateWindow(SIN,/窗口类名窗口类名.4_6,/标题名标题名.WS_OVERLAPPEDWINDOW,/带标题栏带标题栏,最大最大/小按钮的窗口小按钮的窗口CW_USEDEFAULT,/窗口左上角坐标窗口左上角坐标.0,CW_USEDEFAULT,/采用缺省的宽度和高度采用缺省的宽度和高度.0,NULL,/无父窗口无父窗口.NULL,/无主菜单无主菜单.hInstance,/当前实例句柄当前实例句柄.NULL);.ShowWindow(hWnd,nCmdShow);/显示窗口显示窗口.UpdateWindow(hWnd);/更新并绘制用户区更新并绘制用户区.犀替篆伙鲁曰俗露爬去狼辽糕脉吏臭陀怒姐瓷仔垮党墙发统苹才撕幕嗣雷第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图411.for(int j=0;j100;j+)/生成正弦曲线的点坐标生成正弦曲线的点坐标.2.3.lpSinj.x=(long)(j*2*Pi/100*60);4.lpSinj.y=(long)(dfRange*sin(j*2*Pi/100);5. 6.while(GetMessage(&Message,0,0,0)7.8.TranslateMessage(&Message);/消息循环消息循环.9.DispatchMessage(&Message);10.11.return Message.wParam;搐暖崩宇覆豺扁唬疮颓掉继炉璃凤蛙挫醛噬厚跌茁复峻淄兑散炼抬唆禹赡第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图42long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)1.HDC hDC;/定义设备环境句柄定义设备环境句柄.2.HBRUSH hBrush;/定义画刷句柄定义画刷句柄3.HPEN hPen;/定义画笔句柄定义画笔句柄4.PAINTSTRUCT PtStr;/定义包含绘图信息的结构体变量定义包含绘图信息的结构体变量5.switch(iMessage)6. case WM_PAINT:/处理绘图消息处理绘图消息7.hDC=BeginPaint(hWnd,&PtStr);/获得设备环境指针获得设备环境指针8.SetWindowOrgEx(hDC,-200,-200,NULL);/设置原点坐标设置原点坐标9.hPen=CreatePen(PS_DASH,1,RGB(255,0,0);/建新画笔建新画笔10.SelectObject(hDC,hPen);/选入画笔选入画笔11.Polyline(hDC,lpSin,100);/绘制正弦曲线绘制正弦曲线律偷炒踞芋淮赠购鲜翅舜转灸矩兔志毁针颅蚤低设头诫腥乘铁朔凛毅验找第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图43if(i=25) /第一个第一个1/4周期周期.hPen=CreatePen(PS_DASH,1,RGB(255,0,0);hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0);lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25); /计算半径计算半径else if(i=50)/第二个第二个1/4周期周期.hPen=CreatePen(PS_DASH,1,RGB(0,255,0);hBrush=CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0);lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);else if(i=75)/第三个周期第三个周期.hPen=CreatePen(PS_DASH,1,RGB(0,0,255);hBrush=CreateHatchBrush(HS_CROSS,RGB(0,0,255);lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);else/第四个周期第四个周期.hPen=CreatePen(PS_DASH,1,RGB(255,255,0);hBrush=CreateHatchBrush(HS_VERTICAL,RGB(255,255,0);lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);喳越八修趴拼嵌楷沧卫盒抢葬卷撼章弄验迹夏仁耘课实烘使摆呵矩靠场坷第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图441.SelectObject(hDC,hBrush); /选入画刷选入画刷.2.SelectObject(hDC,hPen);/选入画笔选入画笔.3.lCentreX=lpSini.x;/圆心圆心x坐标坐标.4.lCentreY=lpSini.y;/圆心圆心y坐标坐标.5.Ellipse(hDC,lCentreX-lRadious,lCentreY-lRadious, lCentreX+lRadious,lCentreY+lRadious); /画圆画圆6.i+;7.DeleteObject(hPen);/删除画笔删除画笔8.DeleteObject(hBrush);/删除画刷删除画刷9.EndPaint(hWnd,&PtStr);/删除设备环境指针删除设备环境指针10.Sleep(100);/停停0.1秒秒11.if(i100) InvalidateRect(hWnd,NULL,1);/刷新用户区刷新用户区12.return 0;13.case WM_DESTROY:/关闭窗口关闭窗口.14.PostQuitMessage(0);return 0;15.default:16. return(DefWindowProc(hWnd,iMessage,wParam,lParam); 看送口校吓惋浅丈爱庞胚决焉垮商毁藏妆喜艳折纶由斜甥机吗湘议声辅坷第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图45【例【例4-3】绘图与刷新。制订一种重新绘制图形的刷新方式,将图形】绘图与刷新。制订一种重新绘制图形的刷新方式,将图形绘制模块放在消息绘制模块放在消息WM_PAINT的处理过程中,当窗口需要刷新时,的处理过程中,当窗口需要刷新时,通知窗口函数重新绘制图形以完成刷新工作。本例要求先使用画笔和通知窗口函数重新绘制图形以完成刷新工作。本例要求先使用画笔和画刷绘制一个矩形,然后使用红色网格绘制一个椭圆,再使用绿色点画刷绘制一个矩形,然后使用红色网格绘制一个椭圆,再使用绿色点划线绘制椭圆的轴线。划线绘制椭圆的轴线。讨毒犀锹弗迎鸯絮岂吹跃梳蹭说绅酝琳霖拱病洁纠富仕笼胜斡狡酝龚撩湍第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图46#include #include #include #include #include #include #include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, LPSTR lpszCmdLine, int nCmdShow) int nCmdShow) HWND hwnd; HWND hwnd; MSG Msg;MSG Msg;WNDCLASS wndclass;WNDCLASS wndclass; char lpszClassName = char lpszClassName = 基本绘图基本绘图; char lpszTitle= My_Drawing; char lpszTitle= My_Drawing; wndclass.wndclass./填写属性填写属性 wndclass.lpszClassName = lpszClassName ; wndclass.lpszClassName = lpszClassName ;if(!RegisterClass(&wndclass)if(!RegisterClass(&wndclass) MessageBeep(0); return FALSE; MessageBeep(0); return FALSE; hwnd = CreateWindow(hwnd = CreateWindow(, , ,););ShowWindow(hwnd, nCmdShow) ;ShowWindow(hwnd, nCmdShow) ;UpdateWindow(hwnd);UpdateWindow(hwnd);while( GetMessage(&Msg, NULL, 0, 0)while( GetMessage(&Msg, NULL, 0, 0)TranslateMessage(&Msg); DispatchMessage(&Msg);TranslateMessage(&Msg); DispatchMessage(&Msg);return Msg.wParam;return Msg.wParam; 慈思径伺烯佣挚藐驳宪遏迢弗绥札汽正鸽敲炒技惯瑟伦资岸仟阜剃簿砒马第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图47LRESULT CALLBACK WndProc(HWND hwnd,UINT message,LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)WPARAM wParam,LPARAM lParam) HDC hdc; HDC hdc; PAINTSTRUCT ps; PAINTSTRUCT ps; HPEN hP; HPEN hP;/定义画笔句柄定义画笔句柄 HBRUSH hB; HBRUSH hB;/定义画刷句柄定义画刷句柄 switch(message) switch(message) case WM_PAINT:case WM_PAINT:/通过响应通过响应WM_PAINTWM_PAINT消息完成绘图工作消息完成绘图工作 hP=CreatePen(PS_DASHDOT,1,RGB(0,255,0);/ hP=CreatePen(PS_DASHDOT,1,RGB(0,255,0);/自定义绿笔自定义绿笔/所画线条为点划线,宽度为所画线条为点划线,宽度为1 1 hB=CreateHatchBrush(HS_CROSS,RGB(255,0,0);/ hB=CreateHatchBrush(HS_CROSS,RGB(255,0,0);/红色网状红色网状 hdc=BeginPaint(hwnd,&ps); / hdc=BeginPaint(hwnd,&ps); /取得设备环境句柄取得设备环境句柄 SetMapMode(hdc,MM_TEXT); SetMapMode(hdc,MM_TEXT);/设置映射模式,用缺省模式设置映射模式,用缺省模式 /使用当前缺省画笔、画刷进行绘图使用当前缺省画笔、画刷进行绘图 Rectangle(hdc,130,60,270,200); Rectangle(hdc,130,60,270,200);/绘制矩形,并填充绘制矩形,并填充 SelectObject(hdc,hB); SelectObject(hdc,hB);/更新画刷,用更新画刷,用“红色网状红色网状” Ellipse(hdc,130,70,270,190);/ Ellipse(hdc,130,70,270,190);/绘制椭圆,并填充绘制椭圆,并填充 霹畸粹枫抵紧丧韩签翁拙攫宵稠婚逝焉碘形陆航尝尉寝您趟丁殉粕樊饶懒第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图48 SelectObject(hdc,hP); SelectObject(hdc,hP);/更新画笔,选更新画笔,选“自定义绿笔自定义绿笔” MoveToEx(hdc,100,130,NULL); / MoveToEx(hdc,100,130,NULL); /使用当前画笔绘制轴线使用当前画笔绘制轴线 LineTo(hdc,300,130);LineTo(hdc,300,130); MoveToEx(hdc,200,30,NULL); MoveToEx(hdc,200,30,NULL); LineTo(hdc,200,230); LineTo(hdc,200,230); EndPaint(hwnd,&ps); EndPaint(hwnd,&ps);/释放设备环境句柄释放设备环境句柄 break; break;case WM_DESTROY: case WM_DESTROY: DeleteObject(hP);DeleteObject(hP); /退出窗口时删除画笔退出窗口时删除画笔DeleteObject(hB);DeleteObject(hB); /退出窗口时删除黑色画刷退出窗口时删除黑色画刷PostQuitMessage(0);PostQuitMessage(0);break;break;default:default:return DefWindowProc(hwnd,message,wParam,lParam);return DefWindowProc(hwnd,message,wParam,lParam); return 0;return 0; 赠驳灾猾商丰孤惩可剂泊割区蹬伎唆隅搭好往授秀挟执俱伪厂烩谭绳瘤芯第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图49【例【例3-2】设置映像与使用映像模式实例。本例中的程序运行时,初始】设置映像与使用映像模式实例。本例中的程序运行时,初始阶段按模式阶段按模式MM_TEXTMM_TEXT绘图,图形为一个坐标系,以逻辑坐标系的原点为绘图,图形为一个坐标系,以逻辑坐标系的原点为原点,原点,X、Y轴分别是逻辑坐标系的轴分别是逻辑坐标系的X、Y轴。当用户按下轴。当用户按下A键键B键或键或C键时,产生键时,产生WM_CHARWM_CHAR消息,将映像模式分别设置为消息,将映像模式分别设置为ISOTROPICISOTROPIC、ANISOTROPICANISOTROPIC或或LOMETRICLOMETRIC,同时调用,同时调用InvalidateRect函数刷函数刷新用户区。新用户区。按A键按B键按C键察焰诗拾港袁儡猎挠遂樊宣兹悸衬办溉刹疮辖颐淫研本敞绸童缠绑偷辖拆第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图501. #include 1. #include 2. #include 2. #include 3. #include 3. #include 4. #include 4. #include 5. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);5. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);6. int nMode=MM_TEXT; 6. int nMode=MM_TEXT; /设置映像模式的初始值设置映像模式的初始值7. 7. 8. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,8. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)WPARAM wParam,LPARAM lParam)9. HDC hdc;9. HDC hdc;10. PAINTSTRUCT ps;10. PAINTSTRUCT ps;11. HPEN hPen;11. HPEN hPen;12. switch(message)12. switch(message)13.13. 14.14. case WM_CHAR: / case WM_CHAR: /按下不同的键时,设置不同的映像模式按下不同的键时,设置不同的映像模式15.15.15.15.if(wParam=a|wParam=A) if(wParam=a|wParam=A) nMode=MM_ISOTROPIC;nMode=MM_ISOTROPIC;16.16.else if(wParam=b|wParam=B)else if(wParam=b|wParam=B)nMode=MM_ANISOTROPIC;nMode=MM_ANISOTROPIC;17.17.else if(wParam=c|wParam=C)else if(wParam=c|wParam=C)nMode=MM_LOMETRIC;nMode=MM_LOMETRIC;18.18.else ;else ;19.19.InvalidateRect(hwnd,NULL,1);InvalidateRect(hwnd,NULL,1);/刷新用户区刷新用户区20.20.break;break;乾轧赘谅兔疹获次俊孩话拨姐贩乐恼饥藉铅硷舒茨阜僧喂嘘宝粕柴杉吵瞻第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图511. case WM_PAINT:1. case WM_PAINT:2.2.hdc=BeginPaint(hwnd,&ps);hdc=BeginPaint(hwnd,&ps);/取得设备环境句柄取得设备环境句柄3.3.SetMapMode(hdc,nMode); SetMapMode(hdc,nMode); /设置映像模式设置映像模式4.4.SetWindowExtEx(hdc,15,15,NULL); SetWindowExtEx(hdc,15,15,NULL); /设置窗口区域设置窗口区域5.5.SetViewportExtEx(hdc,15,10,NULL); SetViewportExtEx(hdc,15,10,NULL); /设置视口区域设置视口区域6.6.SetViewportOrgEx(hdc,120,120,NULL); SetViewportOrgEx(hdc,120,120,NULL); /设置视口原点设置视口原点7. hPen=CreatePen(PS_SOLID,2,RGB(255,0,0); 7. hPen=CreatePen(PS_SOLID,2,RGB(255,0,0); /创建红色画笔创建红色画笔8.8.SelectObject(hdc,hPen); SelectObject(hdc,hPen); /将画笔选入设备环境将画笔选入设备环境9.9./画坐标系,原点在视口原点画坐标系,原点在视口原点10.10.LineTo(hdc,200,0);LineTo(hdc,200,0);11.11.LineTo(hdc,195,-5);LineTo(hdc,195,-5);12.12.MoveToEx(hdc,200,0,NULL);MoveToEx(hdc,200,0,NULL);13.13.LineTo(hdc,195,5);LineTo(hdc,195,5);14.14.MoveToEx(hdc,0,0,NULL);MoveToEx(hdc,0,0,NULL);15.15.LineTo(hdc,0,200);LineTo(hdc,0,200);16.16.LineTo(hdc,-5,195);LineTo(hdc,-5,195);17.17.MoveToEx(hdc,0,200,NULL);MoveToEx(hdc,0,200,NULL);18.18.LineTo(hdc,5,195);LineTo(hdc,5,195);19.19.DeleteObject(hPen);DeleteObject(hPen);20.20.EndPaint(hwnd,&ps);EndPaint(hwnd,&ps);break;break; case WM_DESTROY: case WM_DESTROY:PostQuitMessage(0);PostQuitMessage(0);break; break; default: default:return DefWindowProc(hwnd,message,wParam,lParam);return DefWindowProc(hwnd,message,wParam,lParam); return 0; return 0; 遗暮哪恿松驹侧血菠卯湾母瞒舒愧嗡嚣念棠赡课弛恕颗坝攻天拉一胸摊蔗第3讲Windows的图形设备接口及windows绘图第3讲Windows的图形设备接口及windows绘图52
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号