版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第7章章 绘图与文本输出绘图与文本输出第第7章章 绘图与文本输出绘图与文本输出 第第7章章 绘图与文本输出绘图与文本输出第第7章章 绘图与文本输出绘图与文本输出 7.1 设备环境设备环境7.2 绘图绘图7.3 绘图编程实例绘图编程实例7.4 文本输出文本输出 7.5 文本输出实例文本输出实例第第7章章 绘图与文本输出绘图与文本输出7.1 设备环境设备环境第第7章章 绘图与文本输出绘图与文本输出7.1.1 设备环境的属性设备环境的属性 设备环境是设备环境是Windows的一个数据结构,它包含该区域的一个数据结构,它包含该区域(窗口窗口)的信息,如当前背景色或区域图案、区域的无效部分等。的信息,
2、如当前背景色或区域图案、区域的无效部分等。 设备环境的各个属性含义如表所示。设备环境的各个属性含义如表所示。第第7章章 绘图与文本输出绘图与文本输出第第7章章 绘图与文本输出绘图与文本输出第第7章章 绘图与文本输出绘图与文本输出第第7章章 绘图与文本输出绘图与文本输出7.1.2 获取设备环境获取设备环境 获取设备环境是应用程序输出图形的先决条件,常用的获获取设备环境是应用程序输出图形的先决条件,常用的获取设备环境的方法是调用函数取设备环境的方法是调用函数BeginPaint和和GetDC。(1) 调用调用BeginPaint函数函数 应用程序响应应用程序响应WM_PAINT消息进行图形刷新时,
3、主要通过消息进行图形刷新时,主要通过调用调用BeginPaint函数获取设备环境函数获取设备环境 hdc=BeginPaint(hwnd,&ps); /ps为为PAINTSTRUCT类型结构类型结构 由由BeginPaint函数获取的设备环境要用函数获取的设备环境要用EndPaint函数释放函数释放 void EndPaint(HWND hwnd, PAINTSTRUCT &ps)系统获取设备环境的系统获取设备环境的同时填写同时填写ps结构,以结构,以标识无效矩形区标识无效矩形区case WM_PAINT: HDC hdc; /定义一个DC句柄变量 PAINTSTRUCT ps; /定义无效区
4、域 hdc = BeginPaint(hwnd, &ps); /使无效窗口变为有效,并获得一个DC句柄 /使用 GDI 函数 EndPaint(hwnd, &ps); /释放DC句柄处理处理WM_PAINT消息必须按上面的方法进行,否则程序将消息必须按上面的方法进行,否则程序将出错!出错!原因:原因:BeginPaint函数使窗口函数使窗口有效有效,然后才可以绘制窗,然后才可以绘制窗口。若无口。若无BeginPaint函数,窗口还是函数,窗口还是无效无效的,的,Windows将不断向窗口过程发送将不断向窗口过程发送WM_PAINT消息,有可能造成系统消息,有可能造成系统崩溃!崩溃!第第7章章
5、绘图与文本输出绘图与文本输出获取设备环境获取设备环境(2) 调用调用GetDC函数函数 如果绘图工作并非由如果绘图工作并非由WM_PAINT消息驱动,则调用消息驱动,则调用GetDC函数获取设备环境。函数获取设备环境。hdc=GetDC(hwnd); 由由GetDC函数获取的设备环境必须用函数获取的设备环境必须用ReleaseDC函数释放函数释放 void ReleaseDC(HWND hwnd);第第7章章 绘图与文本输出绘图与文本输出 函函数数 项项目目 BeginPaint GetDC 适适用用场场合合 只只适适用用于于由由WM_PAINT 消消息息驱驱动动的的图图形形刷刷新新 非非 W
6、M_PAINT消消息息驱驱动动也也可可以以,使使用用范范围围更更广广 操操作作区区域域 无无效效区区域域 整整个个用用户户区区 释释放放设设备备环环境境所所用用函函数数 EndPaint ReleaseDC 函数函数BeginPaint和和GetDC的比较的比较第第7章章 绘图与文本输出绘图与文本输出7.1.3 映像模式映像模式映像模式定义了将映像模式定义了将逻辑单位逻辑单位转化为转化为设备的度量单位设备的度量单位以及以及设备的设备的x方向和方向和y方向方向,程序员可在一个统一的逻辑坐标,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系情况。系中操作而不必考虑输出设备的坐标系情况
7、。1窗口和视口窗口和视口窗口:对应于逻辑坐标系上程序员设定的一个区域。窗口:对应于逻辑坐标系上程序员设定的一个区域。“窗口窗口”基于逻辑坐标,逻辑坐标可以是象素,基于逻辑坐标,逻辑坐标可以是象素,mm,英,英寸或任何想要的其他单位。在寸或任何想要的其他单位。在GDI的绘制函数中使用的的绘制函数中使用的都是都是逻辑窗口坐标逻辑窗口坐标。 视口:对应于实际输出设备上程序员设定的一个区域。视口:对应于实际输出设备上程序员设定的一个区域。“视口视口”是基于设备坐标(象素)的。通常,视口和客是基于设备坐标(象素)的。通常,视口和客户区相同,如果使用了户区相同,如果使用了GetDC或或CreateDC获得
8、一个设备获得一个设备描述表,视口也可指整个窗口坐标或屏幕坐标。描述表,视口也可指整个窗口坐标或屏幕坐标。第第7章章 绘图与文本输出绘图与文本输出映像模式映像模式2坐标系坐标系 要为绘制和其他任务指定位置,需要坐标系统。要为绘制和其他任务指定位置,需要坐标系统。Windows提供了若干种不同的坐标系,每种都有各自的用途。提供了若干种不同的坐标系,每种都有各自的用途。 大致可分为两大类:大致可分为两大类:坐标坐标系统系统逻辑坐标系统逻辑坐标系统设备坐标系统(均以象素点来表示度量的单位。设备坐标系统(均以象素点来表示度量的单位。X轴的正方轴的正方向从左到右,向从左到右,Y轴的正方向为从上向下,轴的正
9、方向为从上向下,原点原点(0,0)位置却不位置却不限定在工作区的左上角限定在工作区的左上角)1.屏幕坐标系统屏幕坐标系统(整个屏幕坐标区)(整个屏幕坐标区)2.窗口坐标系统窗口坐标系统(边界在内的应用程序的窗口)(边界在内的应用程序的窗口)3.用户区坐标系统用户区坐标系统(窗口工作区,不包括窗口(窗口工作区,不包括窗口边界、菜单栏及滚动条等)边界、菜单栏及滚动条等)第第7章章 绘图与文本输出绘图与文本输出三类设备坐标系统的关系三类设备坐标系统的关系提供提供ClientToScreen()、ScreenToClient()两个函数用于完成工作区坐两个函数用于完成工作区坐标和屏幕坐标之间的转换工作
10、。标和屏幕坐标之间的转换工作。第第7章章 绘图与文本输出绘图与文本输出设备坐标系设备坐标系(1) 屏幕坐标系:使用整个屏幕作为坐标区域。以屏幕坐标系:使用整个屏幕作为坐标区域。以CreateDC()或或GetDC(NULL)取得设备上下文时,该上下文使用的坐标系就是取得设备上下文时,该上下文使用的坐标系就是屏幕坐标系。屏幕坐标系。 一些一些与窗口的工作区不相关的函数与窗口的工作区不相关的函数都是以屏幕坐标为单位,例都是以屏幕坐标为单位,例如设置和取得光标位置的函数如设置和取得光标位置的函数SetCursorPos()和和GetCursorPos();由于光标可以在任何一个窗口之间移动,它不属于
11、任何一个单一由于光标可以在任何一个窗口之间移动,它不属于任何一个单一的窗口,因此使用屏幕坐标。弹出式菜单使用的也是屏幕坐标。的窗口,因此使用屏幕坐标。弹出式菜单使用的也是屏幕坐标。另外,另外,CreateWindow、MoveWindow等函数用于设置窗口相对等函数用于设置窗口相对于屏幕的位置,使用的也是屏幕坐标系统。于屏幕的位置,使用的也是屏幕坐标系统。(2) 窗口坐标系:以窗口左上角为坐标原点窗口坐标系:以窗口左上角为坐标原点,它包含了窗口控制菜单、它包含了窗口控制菜单、标题栏等内容。一般情况下很少在窗口标题栏上绘图,因此这种标题栏等内容。一般情况下很少在窗口标题栏上绘图,因此这种坐标系统
12、坐标系统很少使用很少使用。(3) 用户区坐标系:只使用窗口中的用户区作为坐标区域,不包括边用户区坐标系:只使用窗口中的用户区作为坐标区域,不包括边界及菜单栏和滚动条等,主要用于界及菜单栏和滚动条等,主要用于窗口客户区绘图输出窗口客户区绘图输出以及处理以及处理窗口的一些消息窗口的一些消息 。第第7章章 绘图与文本输出绘图与文本输出映像模式映像模式3映像模式映像模式 映像模式定义逻辑坐标系的单位与设备坐标系的度量单位映像模式定义逻辑坐标系的单位与设备坐标系的度量单位之间的转换关系以及设备坐标系的之间的转换关系以及设备坐标系的X方向和方向和Y方向。方向。 优点是:程序员可不必考虑输出设备的具体坐标系
13、,而在优点是:程序员可不必考虑输出设备的具体坐标系,而在一个统一的一个统一的逻辑坐标系逻辑坐标系中进行图形的绘制与操作。中进行图形的绘制与操作。 逻辑坐标按照坐标设置方式(又称为映射模式)可分为逻辑坐标按照坐标设置方式(又称为映射模式)可分为8种,常用的映像模式如下表所示。种,常用的映像模式如下表所示。第第7章章 绘图与文本输出绘图与文本输出缺省的映射模式缺省的映射模式比例可变的映射方式:比例可变的映射方式:纵横的比例为纵横的比例为1:11:1,无论比,无论比例因子如何变化,画出的图例因子如何变化,画出的图形不会改变自己的形状形不会改变自己的形状 比例可变的映射方式:比例可变的映射方式:按照窗
14、口和视口的按照窗口和视口的坐标比坐标比例例进行映射,进行映射,X和和Y的比的比例因子可以独立变化,图例因子可以独立变化,图形的形状可发生变化。形的形状可发生变化。 固定比例的映射方式固定比例的映射方式 映像模式映像模式 一般情况之下,以像素作为绘图的单位,称之为设备坐标。一般情况之下,以像素作为绘图的单位,称之为设备坐标。在进行绘图操作的时候,要用到设备坐标系。在进行绘图操作的时候,要用到设备坐标系。 例如:不管是什例如:不管是什么样的显示设备,若需要在上面显示一么样的显示设备,若需要在上面显示一2英寸高,英寸高,2英寸宽英寸宽的矩形的矩形,该怎样处理呢?这就要依赖于所设定的坐标系。,该怎样处
15、理呢?这就要依赖于所设定的坐标系。 如果指定了如果指定了MM_TEXT 方式,这时坐标原点就位于屏幕的左方式,这时坐标原点就位于屏幕的左上角,上角,X轴和轴和Y轴的方向分别指向我们面对屏幕的右方和下方,轴的方向分别指向我们面对屏幕的右方和下方,绘图单位是像素,如果一英寸对应绘图单位是像素,如果一英寸对应72个像素的话,就需要这样绘个像素的话,就需要这样绘制这个矩形制这个矩形: Rectangle(hdc, 0,0,72*2,72*2); 如果指定了如果指定了MM_LOENGLISH 方式,一个绘图单位是方式,一个绘图单位是0.01英寸,坐标原点仍然位于屏幕的左上角,同样完成绘制上面提到英寸,坐
16、标原点仍然位于屏幕的左上角,同样完成绘制上面提到的矩形:的矩形: Rectangle (hdc, 0,0,200,-200);第第7章章 绘图与文本输出绘图与文本输出映像模式映像模式4映像模式的使用映像模式的使用相关相关函数函数2)设置设备环境的映像模式设置设备环境的映像模式 SetMapMode(hdc, nMapMode); /nMapMode为映像模式的整型标识符为映像模式的整型标识符1)获取当前设备环境的映像模式获取当前设备环境的映像模式 nMapMode=GetMapMode(hdc);第第7章章 绘图与文本输出绘图与文本输出7.2 绘图绘图 第第7章章 绘图与文本输出绘图与文本输出
17、7.2.1 图形刷新图形刷新 窗口的客户区窗口的客户区(Client Area):整个应用程序窗口中未被标:整个应用程序窗口中未被标题栏、窗口边框以及可选的菜单栏、工具栏、状态栏和滚题栏、窗口边框以及可选的菜单栏、工具栏、状态栏和滚动条占据的部分。动条占据的部分。 在在Windows中,用户能在窗口的客户区绘制文本和图形,中,用户能在窗口的客户区绘制文本和图形,而当窗口的客户区被变动时,而当窗口的客户区被变动时,Windows不能保留原来绘制不能保留原来绘制的文本和图形。的文本和图形。 若要恢复原来的文本和图形就必须进行重新绘制,此过程若要恢复原来的文本和图形就必须进行重新绘制,此过程叫叫刷新
18、刷新。 当当Windows向窗口过程发送向窗口过程发送WM_PAINT消息,窗口的客户消息,窗口的客户区就需区就需刷新刷新。 图形刷新图形刷新包括包括刷新请求,刷新请求,对刷新请求的响应对刷新请求的响应和和刷新方法刷新方法第第7章章 绘图与文本输出绘图与文本输出图形刷新图形刷新 若若Windows系统通过发送系统通过发送WM_PAINT消息将刷新请求传消息将刷新请求传递给应用程序,则通常有如下两种情况:递给应用程序,则通常有如下两种情况:(1) 当程序第一次显示窗口时,需要第一次绘制窗口的内部当程序第一次显示窗口时,需要第一次绘制窗口的内部或用户区,这时在显示窗口函数或用户区,这时在显示窗口函
19、数ShowWindow后,需调用后,需调用UpdateWindow函数更新并绘制用户区,并发出函数更新并绘制用户区,并发出WM_PAINT消息。消息。(2) 当用户区的内容需要刷新时,系统在应用程序的消息队当用户区的内容需要刷新时,系统在应用程序的消息队列中加入列中加入WM_PAINT消息,以通知消息处理函数执行刷消息,以通知消息处理函数执行刷新操作。新操作。 窗口被另一个窗口覆盖的区域称为窗口被另一个窗口覆盖的区域称为无效区域无效区域。 Windows系统为每个窗口建立了一个系统为每个窗口建立了一个PAINTSTRUCT结构结构,该结构中包含了包围该结构中包含了包围无效区域无效区域的一个最小
20、矩形的结构的一个最小矩形的结构RECT,应应用程序可以根据此无效矩形执行刷新操作。用程序可以根据此无效矩形执行刷新操作。 typedef struct tagPAINTSTRUCT HDC hdc;/设备环境句柄设备环境句柄 BOOL fErase;/一般取真值,表示擦除无效矩形的背景一般取真值,表示擦除无效矩形的背景 RECT rcPaint;/标识无效矩形标识无效矩形,指定了要重画的矩形区域指定了要重画的矩形区域 BOOL fRestore;/系统保留系统保留,它被它被Windows内部使用内部使用 BOOL fIncUpdate; /系统保留系统保留,它被它被Windows内部使用内部使
21、用 BYTE rgbReserved16;/系统保留系统保留, Windows内部使用的保留内存块内部使用的保留内存块 PAINTSTRUCT;typedef struct tagRECTLONG left; /矩形框左上角矩形框左上角X坐标坐标LONG top; /矩形框左上角矩形框左上角Y坐标坐标LONG right; /矩形框右下角矩形框右下角X坐标坐标LONG bottom; /矩形框右下角矩形框右下角Y坐标坐标RECT;第第7章章 绘图与文本输出绘图与文本输出7.2.2 绘图工具的应用绘图工具的应用1画笔的应用画笔的应用创建画笔创建画笔-直接从设备环境中获取画笔:直接从设备环境中获取
22、画笔: 使用画笔之前必须先定义一个画笔句柄。形式如下使用画笔之前必须先定义一个画笔句柄。形式如下:HPEN hP; hP=GetStockObject(BLACK_PEN);画笔的操作画笔的操作创建画笔创建画笔将画笔选入设备环境将画笔选入设备环境删除画笔删除画笔WHITE_PENBLACK_PENDC_PENNULL_PEN该函数检索预定义的备该函数检索预定义的备用笔、刷子、字体或者用笔、刷子、字体或者调色板的句柄调色板的句柄 第第7章章 绘图与文本输出绘图与文本输出(2)创建画笔创建画笔-创建创建新新画笔画笔hP=CreatePen( int nPenStyle, /确定画笔样式 int n
23、Width, /画笔宽度 COLORREF rgbColor /画笔颜色);(3)创建画笔后,必须调用)创建画笔后,必须调用SelectObject函数将其选入设备环境函数将其选入设备环境 SelectObject(hdc,hP); /hP为所创建或获取的画笔句柄(4)删除画笔:不再使用当前画笔时删除,以免占用内存)删除画笔:不再使用当前画笔时删除,以免占用内存 DeleteObject(hP);PS_DASH:虚线虚线PS_DASHDOT:点划线点划线PS_DASHDOTDOT:双点划线双点划线PS_DOT:点线点线PS_INSIDEFRAME:实线实线PS_NULL:无无PS_SOLID:
24、实线实线第第7章章 绘图与文本输出绘图与文本输出绘图工具的应用绘图工具的应用2画刷的应用画刷的应用与画笔很相似,也包括与画笔很相似,也包括创建创建、选入设备环境选入设备环境和和删除删除。(1) 画刷的创建画刷的创建 HBRUSH hBr; /hBr为画刷句柄为画刷句柄 hBr=(HBRUSH)GetStockObject(nBrushStylenBrushStyle)BLACK_BRUSH 黑色画刷黑色画刷DKGRAY_BRUSH 深灰色画刷深灰色画刷GRAY_BRUSH 灰色画刷灰色画刷HOLLOW_BRUSH 虚画刷虚画刷LTGRAY_BRUSH 亮灰色画刷亮灰色画刷NULL_BRUSH
25、空画刷空画刷WHITE_BRUSH 白色画刷白色画刷指定颜色画指定颜色画刷如何获得?刷如何获得?/画刷样式第第7章章 绘图与文本输出绘图与文本输出调用函数调用函数CreateSolidBrush和和CreateHatchBrush创建画刷创建画刷hBr=CreateSolidBrush(rgbColor); 创建具有指定颜色创建具有指定颜色的单色画刷的单色画刷创建指定创建指定阴影图案阴影图案和颜色的画刷和颜色的画刷(2) 选入设备环境选入设备环境 创建画刷后,通过创建画刷后,通过SelectObject(hdc,hBr)将其选入设备环境将其选入设备环境(3) 删除画刷删除画刷 不使用画刷时,用
26、不使用画刷时,用DeleteObject(hBr) 删除画刷,释放内存删除画刷,释放内存hBr=CreateHatchBrush(int nHatchStyle, COLORREF rgbColor);HS_BDIAGONAL 45度从左上到右下度从左上到右下HS_DIAGCROSS 45度叉线度叉线HS_FDIAGONAL 45度从左下到右上度从左下到右上HS_CROSS 垂直相交的阴影线垂直相交的阴影线HS_HORIZONTAL 水平阴影线水平阴影线HS_VERTICAL 垂直阴影线垂直阴影线第第7章章 绘图与文本输出绘图与文本输出绘图工具的应用绘图工具的应用3颜色的设置颜色的设置Wind
27、ows使用使用32位无符号整数表示颜色,其中低三位字节分别位无符号整数表示颜色,其中低三位字节分别表示红、绿、蓝三种颜色,每一个颜色值的范围为表示红、绿、蓝三种颜色,每一个颜色值的范围为0255。Windows使用使用RGB定义绘图颜色,其形式为:定义绘图颜色,其形式为:RGB(nRed,nGreen,nBlue);312423161587024-31位为位为016-23位表示红色位表示红色8-15位表示绿色位表示绿色0-7位表示蓝色位表示蓝色红色值红色值蓝色值蓝色值绿色值绿色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)第第7章章 绘图与文本输出绘图与文本输出7.
28、2.3 常用绘图函数常用绘图函数1. 设置画笔当前位置设置画笔当前位置 BOOL MoveTo ( HDC hdc, int X,Y, / X、Y分别为新位置的逻辑坐标分别为新位置的逻辑坐标 LPPOINT lpPoint /存放原画笔位置的存放原画笔位置的POINT结构地址结构地址 )2.两点连线 BOOL LineTo( HDC hdc,int X,int Y) /X和和Y为线段的终点坐标为线段的终点坐标3.多点连线 BOOL Polyline ( HDC hdc, LPPOINT lpPoints, /指向包含各点坐标的指向包含各点坐标的POINT结构数组的指针结构数组的指针 int n
29、Count / nCount为为POINT数组中点的个数数组中点的个数 )第第7章章 绘图与文本输出绘图与文本输出4绘制椭圆绘制椭圆BOOL Ellipse ( HDC hdc, int X1,intY1,/边框矩形左上角的逻辑坐标边框矩形左上角的逻辑坐标 int X2,int Y2,/边框矩形右下角的逻辑坐标边框矩形右下角的逻辑坐标) (x1,y1)(x2,y2)所画椭圆所画椭圆第第7章章 绘图与文本输出绘图与文本输出5绘制椭圆弧线绘制椭圆弧线BOOL Arc ( HDC hdc,int X1,intY1,/边框矩形左上角的逻辑坐标边框矩形左上角的逻辑坐标int X2,int Y2,/边框矩
30、形右下角的逻辑坐标边框矩形右下角的逻辑坐标int X3,int Y3,/椭圆弧起始点坐标椭圆弧起始点坐标int X4,int Y4/椭圆弧终止点坐标椭圆弧终止点坐标) (x1,y1)(x2,y2)(x3,y3)(x4,y4)所画曲线所画曲线第第7章章 绘图与文本输出绘图与文本输出6绘制饼图,并用当前画刷进行填充绘制饼图,并用当前画刷进行填充BOOL Pie (HDC hdc, int X1,intY1,/边框矩形左上角的逻辑坐标边框矩形左上角的逻辑坐标int X2,int Y2,/边框矩形右下角的逻辑坐标边框矩形右下角的逻辑坐标int X3,int Y3,/椭圆弧起始经线的确定点坐标椭圆弧起始
31、经线的确定点坐标int X4,int Y4/椭圆弧终止经线的确定点坐标椭圆弧终止经线的确定点坐标)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所填区域所填区域第第7章章 绘图与文本输出绘图与文本输出7绘制矩形,并用当前画刷进行填充绘制矩形,并用当前画刷进行填充 BOOL Rectangle(HDC hdc,int X1,int Y1,int X2,int Y2)(X1,Y1)和和(X2,Y2)分别分别为矩形的左上角和右为矩形的左上角和右下角的逻辑坐标下角的逻辑坐标8绘制圆角矩形,并用当前画刷填充绘制圆角矩形,并用当前画刷填充 BOOL RoundRect (HDC hdc,int
32、X1,int Y1,int X2,int Y2, int nHeight, int nWidth)圆角的圆角的椭圆的椭圆的高度和宽度高度和宽度9绘制多边形,并用当前画刷填充绘制多边形,并用当前画刷填充 BOOL Polygon(HDC hdc,LPPOINT lpPoints,int nCount)包含各点坐标的包含各点坐标的POINT数组的地址数组的地址多边形点的个数多边形点的个数第第7章章 绘图与文本输出绘图与文本输出7.3 绘图编程实例绘图编程实例 例例7-1 在在Windows窗窗口中绘制如图所示口中绘制如图所示的图形。的图形。利用绘图利用绘图函数创建填充区。函数创建填充区。共有三个填
33、充图形,共有三个填充图形,第一个是用深灰色第一个是用深灰色画刷填充带圆角的画刷填充带圆角的矩形,第二个是采矩形,第二个是采用亮灰色画刷填充用亮灰色画刷填充一个椭圆,第三个一个椭圆,第三个是用虚画刷填充饼是用虚画刷填充饼图。图。 使用虚画刷填充时,看不出填充效果使用虚画刷填充时,看不出填充效果!BOOL InitWindowsClass(HINSTANCE hInstance);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);HWND hWndMain;int WINAPI WinMain( HINSTANCE hInstance, HINS
34、TANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) /主函数主函数MSG Message;if(!(hInstance)return FALSE;if(!(hInstance,nCmdShow) return FALSE;while(GetMessage(&Message,0,0,0)/消息循环消息循环 TranslateMessage(&Message);DispatchMessage(&Message); return Message.wParam;#include#include#includelong WINAPI WndProc(H
35、WND hWnd,UINT iMessage,UINT wParam,LONG lParam) ); ;long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) HDC hdc; /设备的句柄设备的句柄PAINTSTRUCT ps; /定义指向包含绘图信息的结构体变量定义指向包含绘图信息的结构体变量 HBRUSH hBrush; /画刷的句柄画刷的句柄 HPEN hPen;/画笔的句柄画笔的句柄switch(iMessage) /处理消息处理消息case WM_PAINT: /处理绘图消息处理绘图消息 hdc=Be
36、ginPaint(hWnd,&ps); /获取设备环境获取设备环境 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); /绘制绘制圆角矩
37、形圆角矩形 hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); /亮灰色画刷亮灰色画刷 SelectObject(hdc,hBrush); /选择画刷选择画刷 Ellipse(hdc,150,50,200,150); /绘制绘制椭圆椭圆下面只改变下面只改变画刷,不改画刷,不改变笔变笔MM_ANISOTROPIC系统确定系统确定Y下,下,X右右 hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH); /虚画刷虚画刷 SelectObject(hdc,hBrush); /选择画刷选择画刷 Pie(hdc,250,50,300,
38、100,250,50,300,50); /绘制绘制饼形饼形 EndPaint(hWnd,&ps); /结束绘图结束绘图 break;case WM_DESTROY: /结束应用程序结束应用程序 PostQuitMessage(0); break;default: /其他消息处理程序其他消息处理程序 return(DefWindowProc(hWnd,iMessage,wParam,lParam) ;BOOL InitWindowsClass(HINSTANCE hInstance)/定义窗口类定义窗口类 WNDCLASS WndClass; WndClass.cbClsExtra=0; Wnd
39、Class.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=CS_H
40、REDRAW|CS_VREDRAW; return RegisterClass(&WndClass);BOOL 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; Sh
41、owWindow(hWnd,nCmdShow);/显示窗口显示窗口 UpdateWindow(hWnd); return TRUE;如果该参数被设为如果该参数被设为CW_USEDEFAULT则系统为窗口选择则系统为窗口选择缺省的左上角坐标缺省的左上角坐标并忽略并忽略Y参数参数若若nWidth是是CW_USEDEFAULT,则系统为窗口选择一个则系统为窗口选择一个缺省的高度和宽度缺省的高度和宽度第第7章章 绘图与文本输出绘图与文本输出例例7-2 编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨迹编写一个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动的实心圆。要求每隔移动的实心圆。要求每隔1/4周期,
42、圆的填充色和圆的周边周期,圆的填充色和圆的周边颜色都发生变化颜色都发生变化(颜色自己选取颜色自己选取),同时,同时,圆的半径在圆的半径在1/4周周期之内由正弦曲线幅值的期之内由正弦曲线幅值的0.20.6倍线性增长倍线性增长。(1) 正弦曲线是此题的基础。在正弦曲线是此题的基础。在WinMain()函数的消息循环前,函数的消息循环前,生成正弦曲线各点的坐标。把正弦曲线一个周期的横坐标分成生成正弦曲线各点的坐标。把正弦曲线一个周期的横坐标分成100个等分点,存储在数组个等分点,存储在数组lpSin100中,中,100个点的坐标计算个点的坐标计算如下:如下:for(int j=0;j100;j+)/
43、生成正弦曲线的点坐标生成正弦曲线的点坐标 lpSinj.x=(long)(j*2*Pi *60 /100); /横坐标扩大横坐标扩大60倍倍 lpSinj.y=(long)(dfRange*sin(j*2*Pi/100) ); /纵坐标扩大纵坐标扩大100倍倍 (2) 动态显示圆在正弦曲线上移动动态显示圆在正弦曲线上移动数组数组lpSin100的长度为的长度为100设定圆在正弦曲线移动时共有设定圆在正弦曲线移动时共有100个位置个位置数组中每一个值是圆移动时圆心的坐标数组中每一个值是圆移动时圆心的坐标每四分之一周期有每四分之一周期有25个位置个位置 i=25处于第处于第1个个1/4周期,创建周
44、期,创建红色画笔和画刷红色画笔和画刷;25i=50处于第处于第2个个1/4周期,创建周期,创建绿色画笔和画刷绿色画笔和画刷;50i=75处于第处于第3个个1/4周期,创建周期,创建蓝色画笔和画刷蓝色画笔和画刷;75i=100处于第处于第4个个1/4周期,创建周期,创建黄色画笔和画刷黄色画笔和画刷;if(i=25) /第一个第一个1/4周期周期 hPen=CreatePen(PS_DASH,1,RGB(255,0,0); /创建红色画笔创建红色画笔 hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0); /创建红色画刷创建红色画刷 lRadious=
45、(long)(dfRange*0.2+i%25*dfRange*0.4/25);/计算半径计算半径在消息在消息WM_PAINT处理程序中,调用函数处理程序中,调用函数BeginPaint()获得获得设备环境句柄。由此经过线性差分计算圆半径的大小设备环境句柄。由此经过线性差分计算圆半径的大小lRadious,第,第1个个1/4周期的程序代码如下:周期的程序代码如下:PS_DASH:虚线:虚线HS_BDIAGONAL:45度从左上到右下度从左上到右下0,0,201,1.6,212,3.2,233,4.8,244,6.4,265,8,286,9.6,297,11.2, 318,12.8, 329,1
46、4.4, 3410, 16,3611, 17.6, 3712, 19.2, 3913, 20.8, 4014, 22.4, 421,1.6,212,3.2,233,4.8,244,6.4,265,8,286,9.6,297,11.2, 318,12.8, 329,14.4, 3410, 16,3611, 17.6, 3712, 19.2, 3913, 20.8, 4014, 22.4, 4215, 24,4416, 25.6, 4517, 27.2, 4718, 28.8, 4819, 30.4, 5020, 32,5221, 33.6, 5322, 35.2, 5523, 36.8, 562
47、4, 38.4, 580,0,2015, 24,4416, 25.6, 4517, 27.2, 4718, 28.8, 4819, 30.4, 5020, 32,5221, 33.6, 5322, 35.2, 5523, 36.8, 5624, 38.4, 580,0,20i%25,i%25*100.0*0.4/25, lRadious (dfRange*0.2+i%25*dfRange*0.4/25)创建的画笔和画刷选入设备环境后,调用函数创建的画笔和画刷选入设备环境后,调用函数Ellipse()绘制绘制圆形。下面这段代码是动态显示的关键:圆形。下面这段代码是动态显示的关键:Sleep(10
48、0);/停停0.1秒秒if(i100) InvalidateRect(hWnd,NULL,1);/刷新用户区刷新用户区 调用调用Sleep(100)函数使程序暂停函数使程序暂停100毫秒。所含参数毫秒。所含参数100代表代表暂停的时间,使用毫秒作单位。暂停的时间,使用毫秒作单位。i100时调用函数刷时调用函数刷新用户区发送新用户区发送WM_PAINT消息消息消息发到的消息发到的窗口的句柄窗口的句柄代表刷新代表刷新整个用户区整个用户区代表清除用户区中代表清除用户区中所有的显示内容所有的显示内容#include #include #include #include long WINAPI WndP
49、roc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);int WINAPI WinMain(,.) / 填写窗口类属性填写窗口类属性if(!)/注册窗口注册窗口.MessageBeep(0);return FALSE;hWnd=(SIN,/窗口类名窗口类名.4_6,/标题名标题名.WS_OVERLAPPEDWINDOW, /带标题栏带标题栏,最大最大/小按钮的窗口小按钮的窗口CW_USEDEFAULT,/窗口左上角坐标窗口左上角坐标.CW_USEDEFAULT,CW_USEDEFAULT,/采用缺省的宽度和高度采用缺省的宽度和高度.CW_US
50、EDEFAULT,NULL,/无父窗口无父窗口.NULL,/无主菜单无主菜单.hInstance,/当前实例句柄当前实例句柄.NULL);(hWnd,nCmdShow);/显示窗口显示窗口.(hWnd);/更新并绘制用户区更新并绘制用户区.while(GetMessage(&Message,0,0,0)TranslateMessage(&Message);/消息循环消息循环.DispatchMessage(&Message);return Message.wParam;long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lP
51、aram)switch(iMessage) case WM_PAINT:/处理绘图消息处理绘图消息 Polyline(hdc,lpSin,100);/绘制正弦曲线绘制正弦曲线BOOL SetWindowOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint);lpPoint:指向:指向POINT结构的指针,先前的窗口原点存放在此结构中,如果结构的指针,先前的窗口原点存放在此结构中,如果lpPoint的值为的值为NULL,则什么也没返回。,则什么也没返回。SelectObject(hdc,hBrush);/选入画刷选入画刷.SelectObject(hdc,hP
52、en);/选入画笔选入画笔.lCentreX=lpSini.x;/圆心圆心x坐标坐标.lCentreY=lpSini.y;/圆心圆心y坐标坐标. /画圆画圆 /控制下一次显示的圆(圆心、半径、颜色、填充色)控制下一次显示的圆(圆心、半径、颜色、填充色)DeleteObject(hPen);/删除画笔删除画笔DeleteObject(hBrush);/删除画刷删除画刷EndPaint(hWnd,&ps);/删除设备环境删除设备环境Sleep(100);/停停0.1秒秒break; case WM_DESTROY:/关闭窗口关闭窗口.PostQuitMessage(0);break; defaul
53、t: return(DefWindowProc(hWnd,iMessage,wParam,lParam); BOOL InvalidateRect( HWND hWnd, CONST RECT *lpRect, BOOL bErase ); lpRect:无效区域的矩形代表,它是一个结构:无效区域的矩形代表,它是一个结构体指针,存放着矩形的大小。如果为体指针,存放着矩形的大小。如果为NULL,全部的窗口客户区域将被增加到更新区域中。全部的窗口客户区域将被增加到更新区域中。 bErase:指出无效矩形被标记为有效后,是:指出无效矩形被标记为有效后,是否重画该区域,重画时用预先定义好的画刷。否重画
54、该区域,重画时用预先定义好的画刷。当指定当指定TRUE时需要重画。时需要重画。第第7章章 绘图与文本输出绘图与文本输出移动圆程序的运行结果如图所示。移动圆程序的运行结果如图所示。第第7章章 绘图与文本输出绘图与文本输出课后大作业课后大作业7-2-2:(必做必做)编写程序,每隔编写程序,每隔1s,交替用红色、绿色和蓝色,交替用红色、绿色和蓝色填充整个窗口用户区。填充整个窗口用户区。7-2-3:(选做选做)在窗口中画一个旋转的风车。要求风车有三个在窗口中画一个旋转的风车。要求风车有三个叶片,且每个叶片的颜色不同。叶片,且每个叶片的颜色不同。第第7章章 绘图与文本输出绘图与文本输出习题习题7-2-2
55、算法思路一算法思路一 WM_PAINT消息响应中先在获取用户区大小;消息响应中先在获取用户区大小; GetClientRect (hwnd, &rc) ; 根据判定条件用指定的颜色值绘制矩形框覆盖整个用户区根据判定条件用指定的颜色值绘制矩形框覆盖整个用户区 SelectObject(hDC,CreateSolidBrush(RGB(0,255,0); Rectangle(hDC,0,0,x,y); 条件值改变(如:条件值改变(如:+1) 使用使用InvalidateRect (hwnd, NULL, 1) ; 强制刷新,发出强制刷新,发出WM_PAINT消息,循环多支选择,再根据新的判定条件消
56、息,循环多支选择,再根据新的判定条件覆盖用户区覆盖用户区第第7章章 绘图与文本输出绘图与文本输出习题习题7-2-2算法思路二算法思路二 WM_PAINT消息响应中先在获取用户区大小;消息响应中先在获取用户区大小; GetClientRect (hwnd, &rc) ; 根据判定条件用指定的颜色值填充整个用户区;根据判定条件用指定的颜色值填充整个用户区; FillRect(hDC,&rect,CreateSolidBrush(RGB(255,0,0); 条件值改变(如:条件值改变(如:+1) 使用使用InvalidateRect (hwnd, NULL, 1) ; 强制刷新,发出强制刷新,发出W
57、M_PAINT消息,循环多支选择,再根据新的判定条件消息,循环多支选择,再根据新的判定条件覆盖用户区覆盖用户区该函数用指定的画刷填充矩形,此函数包括矩形的左上边界,但不包括矩形该函数用指定的画刷填充矩形,此函数包括矩形的左上边界,但不包括矩形的右下边界。的右下边界。函数原型:函数原型:int FillRect(HDC hdc, CONST RECT *lprc, HBRUSH hbr);hdc:设备环境句柄。:设备环境句柄。lprc:指向含有将填充矩形的逻辑坐标的:指向含有将填充矩形的逻辑坐标的RECT结构的指针。结构的指针。hbr:用来填充矩形的画刷的句柄。:用来填充矩形的画刷的句柄。返回值
58、:若函数调用成功,返回值非零;若函数调用失败,返回值是返回值:若函数调用成功,返回值非零;若函数调用失败,返回值是0。第第7章章 绘图与文本输出绘图与文本输出7.4 文本输出文本输出 使用定义好的与设备无关的使用定义好的与设备无关的字体字体集,集, Windows就能维护设就能维护设备无关性,提供备无关性,提供“所见即所得所见即所得” ,即屏幕所见与设备输出的文,即屏幕所见与设备输出的文本一样本一样. 输出文本时,必须以逻辑坐标为单位计算文本的位置。输出文本时,必须以逻辑坐标为单位计算文本的位置。 Windows经常使用经常使用GDI进进行文本输出。在一定意义上行文本输出。在一定意义上,任何内
59、容都可以看成,任何内容都可以看成图形图形实体实体.图形和文本并图形和文本并没有明显的界限没有明显的界限文本文本操作操作先获得文本句柄先获得文本句柄设置字体、字符大小、字符颜色等有关属性设置字体、字符大小、字符颜色等有关属性将这些属性选入设备环境将这些属性选入设备环境第第7章章 绘图与文本输出绘图与文本输出7.4.1 设置文本的设备环境设置文本的设备环境字体字体逻辑字体逻辑字体定义的字符集是定义的字符集是设备无关设备无关的,它可以精确标度,的,它可以精确标度,因此得到广泛应用因此得到广泛应用物理字体物理字体是为特殊设备设计的,因而是是为特殊设备设计的,因而是设备相关设备相关的的Win 系统提供了
60、系统提供了七种基本字体七种基本字体字体字体 说明说明ANSI_FIXED ANSI标准的标准的固定固定宽度的字体宽度的字体ANSI_VAR ANSI标准的标准的可变可变宽度的字体宽度的字体DEFAULT_GUI当前当前GUI的缺省字体的缺省字体OEM_FIXED 由标准原设备制造商由标准原设备制造商(OEM)提供提供DEVICE_DEFAULT当前图形设备的字体当前图形设备的字体SYSTEM_FIXEDWindows的标准的标准固定固定宽度的字体宽度的字体SYSTEM Windows提供的提供的可变可变宽度的字体宽度的字体常为缺省字体常为缺省字体 Win用它作为用它作为系统界面字体系统界面字体
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年云南工程职业学院马克思主义基本原理概论期末考试真题汇编
- 基于云计算的数字化教学管理绩效评估指标体系在高校教学管理信息化中的应用研究教学研究课题报告
- 2025年西南交通大学马克思主义基本原理概论期末考试真题汇编
- 2025年华北电业联合职工大学马克思主义基本原理概论期末考试笔试真题汇编
- 2025年中南林业科技大学涉外学院马克思主义基本原理概论期末考试笔试真题汇编
- 2025年桂林医学院马克思主义基本原理概论期末考试真题汇编
- 2025年鹤岗师范高等专科学校马克思主义基本原理概论期末考试参考题库
- 2025年山西传媒学院马克思主义基本原理概论期末考试真题汇编
- 2024年景德镇学院马克思主义基本原理概论期末考试笔试题库
- 2024年四川现代职业学院马克思主义基本原理概论期末考试真题汇编
- 《毛泽东思想概论》与《中国特色社会主义理论体系概论》核心知识点梳理及100个自测题(含答案)
- 成人术后疼痛管理临床实践指南(2025版)
- 论语子张篇课件
- 扶梯咬人应急预案(3篇)
- 2025秋人教版(新教材)初中信息科技七年级(全一册)第一学期知识点及期末测试卷及答案
- 2025 医学急危重症重症重症剥脱性皮炎护理课件
- 医风医德培训课件
- 党的二十届四中全会精神题库
- 3D打印技术合同
- 注塑拌料作业指引 配料作业指导书全套
- 地基钎探记录(示范表格)
评论
0/150
提交评论