第07章 绘图与文本输出

上传人:今*** 文档编号:106520023 上传时间:2019-10-15 格式:PPT 页数:66 大小:943KB
返回 下载 相关 举报
第07章 绘图与文本输出_第1页
第1页 / 共66页
第07章 绘图与文本输出_第2页
第2页 / 共66页
第07章 绘图与文本输出_第3页
第3页 / 共66页
第07章 绘图与文本输出_第4页
第4页 / 共66页
第07章 绘图与文本输出_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《第07章 绘图与文本输出》由会员分享,可在线阅读,更多相关《第07章 绘图与文本输出(66页珍藏版)》请在金锄头文库上搜索。

1、第7章 绘图与文本输出,第7章 绘图与文本输出,7.1 设备环境 7.2 绘图 7.3 绘图编程实例 7.4 文本输出 7.5 文本输出实例,7.1 设备环境,7.1.1 设备环境的属性,设备环境是Windows的一个数据结构,它包含该区域(窗口)的信息,如当前背景色或区域图案、区域的无效部分等。 设备环境的各个属性含义如表所示。,7.1.2 获取设备环境,获取设备环境是应用程序输出图形的先决条件,常用的获取设备环境的方法是调用函数BeginPaint和GetDC。 (1) 调用BeginPaint函数 应用程序响应WM_PAINT消息进行图形刷新时,主要通过调用BeginPaint函数获取设

2、备环境 hdc=BeginPaint(hwnd,&ps); /ps为PAINTSTRUCT类型结构 由BeginPaint函数获取的设备环境要用EndPaint函数释放 void EndPaint(HWND hwnd, PAINTSTRUCT &ps),系统获取设备环境的 同时填写ps结构,以 标识无效矩形区,case WM_PAINT: HDC hdc; /定义一个DC句柄变量 PAINTSTRUCT ps; /定义无效区域 hdc = BeginPaint(hwnd, /释放DC句柄,处理WM_PAINT消息必须按上面的方法进行,否则程序将出错! 原因:BeginPaint函数使窗口有效,

3、然后才可以绘制窗口。若无BeginPaint函数,窗口还是无效的,Windows将不断向窗口过程发送WM_PAINT消息,有可能造成系统崩溃!,获取设备环境,(2) 调用GetDC函数 如果绘图工作并非由WM_PAINT消息驱动,则调用GetDC函数获取设备环境。 hdc=GetDC(hwnd); 由GetDC函数获取的设备环境必须用ReleaseDC函数释放 void ReleaseDC(HWND hwnd);,函数BeginPaint和GetDC的比较,7.1.3 映像模式,映像模式定义了将逻辑单位转化为设备的度量单位以及设备的x方向和y方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑

4、输出设备的坐标系情况。 1窗口和视口 窗口:对应于逻辑坐标系上程序员设定的一个区域。“窗口”基于逻辑坐标,逻辑坐标可以是象素,mm,英寸或任何想要的其他单位。在GDI的绘制函数中使用的都是逻辑窗口坐标。 视口:对应于实际输出设备上程序员设定的一个区域。“视口”是基于设备坐标(象素)的。通常,视口和客户区相同,如果使用了GetDC或CreateDC获得一个设备描述表,视口也可指整个窗口坐标或屏幕坐标。,映像模式,2坐标系 要为绘制和其他任务指定位置,需要坐标系统。Windows提供了若干种不同的坐标系,每种都有各自的用途。 大致可分为两大类:,坐标系统,逻辑坐标系统,设备坐标系统(均以象素点来表

5、示度量的单位。X轴的正方向从左到右,Y轴的正方向为从上向下,原点(0,0)位置却不限定在工作区的左上角),三类设备坐标系统的关系,提供ClientToScreen()、ScreenToClient()两个函数用于完成工作区坐标和屏幕坐标之间的转换工作。,设备坐标系,(1) 屏幕坐标系:使用整个屏幕作为坐标区域。以CreateDC()或GetDC(NULL)取得设备上下文时,该上下文使用的坐标系就是屏幕坐标系。 一些与窗口的工作区不相关的函数都是以屏幕坐标为单位,例如设置和取得光标位置的函数SetCursorPos()和GetCursorPos();由于光标可以在任何一个窗口之间移动,它不属于任

6、何一个单一的窗口,因此使用屏幕坐标。弹出式菜单使用的也是屏幕坐标。另外,CreateWindow、MoveWindow等函数用于设置窗口相对于屏幕的位置,使用的也是屏幕坐标系统。 (2) 窗口坐标系:以窗口左上角为坐标原点,它包含了窗口控制菜单、标题栏等内容。一般情况下很少在窗口标题栏上绘图,因此这种坐标系统很少使用。 (3) 用户区坐标系:只使用窗口中的用户区作为坐标区域,不包括边界及菜单栏和滚动条等,主要用于窗口客户区绘图输出以及处理窗口的一些消息 。,映像模式,3映像模式 映像模式定义逻辑坐标系的单位与设备坐标系的度量单位之间的转换关系以及设备坐标系的X方向和Y方向。 优点是:程序员可不

7、必考虑输出设备的具体坐标系,而在一个统一的逻辑坐标系中进行图形的绘制与操作。 逻辑坐标按照坐标设置方式(又称为映射模式)可分为8种,常用的映像模式如下表所示。,映像模式,一般情况之下,以像素作为绘图的单位,称之为设备坐标。在进行绘图操作的时候,要用到设备坐标系。 例如:不管是什么样的显示设备,若需要在上面显示一2英寸高,2英寸宽的矩形,该怎样处理呢?这就要依赖于所设定的坐标系。 如果指定了MM_TEXT 方式,这时坐标原点就位于屏幕的左上角,X轴和Y轴的方向分别指向我们面对屏幕的右方和下方,绘图单位是像素,如果一英寸对应72个像素的话,就需要这样绘制这个矩形: Rectangle(hdc, 0

8、,0,72*2,72*2); 如果指定了MM_LOENGLISH 方式,一个绘图单位是0.01英寸,坐标原点仍然位于屏幕的左上角,同样完成绘制上面提到的矩形: Rectangle (hdc, 0,0,200,-200);,映像模式,4映像模式的使用,相关 函数,2)设置设备环境的映像模式 SetMapMode(hdc, nMapMode); /nMapMode为映像模式的整型标识符,1)获取当前设备环境的映像模式 nMapMode=GetMapMode(hdc);,7.2 绘图,7.2.1 图形刷新,窗口的客户区(Client Area):整个应用程序窗口中未被标题栏、窗口边框以及可选的菜单栏

9、、工具栏、状态栏和滚动条占据的部分。 在Windows中,用户能在窗口的客户区绘制文本和图形,而当窗口的客户区被变动时,Windows不能保留原来绘制的文本和图形。 若要恢复原来的文本和图形就必须进行重新绘制,此过程叫刷新。 当Windows向窗口过程发送WM_PAINT消息,窗口的客户区就需刷新。 图形刷新包括刷新请求,对刷新请求的响应和刷新方法,图形刷新,若Windows系统通过发送WM_PAINT消息将刷新请求传递给应用程序,则通常有如下两种情况: (1) 当程序第一次显示窗口时,需要第一次绘制窗口的内部或用户区,这时在显示窗口函数ShowWindow后,需调用UpdateWindow函

10、数更新并绘制用户区,并发出WM_PAINT消息。 (2) 当用户区的内容需要刷新时,系统在应用程序的消息队列中加入WM_PAINT消息,以通知消息处理函数执行刷新操作。,窗口被另一个窗口覆盖的区域称为无效区域。 Windows系统为每个窗口建立了一个PAINTSTRUCT结构,该结构中包含了包围无效区域的一个最小矩形的结构RECT,应用程序可以根据此无效矩形执行刷新操作。,typedef struct tagPAINTSTRUCT HDC hdc; /设备环境句柄 BOOL fErase; /一般取真值,表示擦除无效矩形的背景 RECT rcPaint; /标识无效矩形,指定了要重画的矩形区域

11、 BOOL fRestore; /系统保留,它被Windows内部使用 BOOL fIncUpdate; /系统保留,它被Windows内部使用 BYTE rgbReserved16;/系统保留, Windows内部使用的保留内存块 PAINTSTRUCT;,7.2.2 绘图工具的应用,1画笔的应用,创建画笔-直接从设备环境中获取画笔: 使用画笔之前必须先定义一个画笔句柄。形式如下: HPEN hP; hP=GetStockObject(BLACK_PEN);,画笔的操作,创建画笔,将画笔选入设备环境,删除画笔,WHITE_PEN BLACK_PEN DC_PEN NULL_PEN,该函数检索

12、预定义的备用笔、刷子、字体或者调色板的句柄,(2)创建画笔-创建新画笔 hP=CreatePen( int nPenStyle, /确定画笔样式 int nWidth, /画笔宽度 COLORREF rgbColor /画笔颜色 );,(3)创建画笔后,必须调用SelectObject函数将其选入设备环境 SelectObject(hdc,hP); /hP为所创建或获取的画笔句柄,(4)删除画笔:不再使用当前画笔时删除,以免占用内存 DeleteObject(hP);,PS_DASH: 虚线 PS_DASHDOT: 点划线 PS_DASHDOTDOT: 双点划线 PS_DOT: 点线 PS_I

13、NSIDEFRAME: 实线 PS_NULL: 无 PS_SOLID: 实线,绘图工具的应用,2画刷的应用 与画笔很相似,也包括创建、选入设备环境和删除。 (1) 画刷的创建 HBRUSH hBr; /hBr为画刷句柄 hBr=(HBRUSH)GetStockObject(nBrushStyle),BLACK_BRUSH 黑色画刷 DKGRAY_BRUSH 深灰色画刷 GRAY_BRUSH 灰色画刷 HOLLOW_BRUSH 虚画刷 LTGRAY_BRUSH 亮灰色画刷 NULL_BRUSH 空画刷 WHITE_BRUSH 白色画刷,指定颜色画 刷如何获得?,调用函数CreateSolidBr

14、ush和CreateHatchBrush创建画刷 hBr=CreateSolidBrush(rgbColor);,创建具有指定颜色 的单色画刷,创建指定阴影图案 和颜色的画刷,(2) 选入设备环境 创建画刷后,通过SelectObject(hdc,hBr)将其选入设备环境 (3) 删除画刷 不使用画刷时,用DeleteObject(hBr) 删除画刷,释放内存,绘图工具的应用,3颜色的设置 Windows使用32位无符号整数表示颜色,其中低三位字节分别表示红、绿、蓝三种颜色,每一个颜色值的范围为0255。 Windows使用RGB定义绘图颜色,其形式为: RGB(nRed,nGreen,nBl

15、ue);,7.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 nCount / nCount为POINT数组中点的个数 ),4绘制椭圆 BOOL Ellipse ( H

16、DC hdc, int X1,intY1, /边框矩形左上角的逻辑坐标 int X2,int Y2, /边框矩形右下角的逻辑坐标 ),(x1,y1),(x2,y2),5绘制椭圆弧线 BOOL Arc ( HDC hdc, int X1,intY1, /边框矩形左上角的逻辑坐标 int X2,int Y2, /边框矩形右下角的逻辑坐标 int X3,int Y3, /椭圆弧起始点坐标 int X4,int Y4 /椭圆弧终止点坐标 ),6绘制饼图,并用当前画刷进行填充 BOOL Pie ( HDC hdc, int X1,intY1, /边框矩形左上角的逻辑坐标 int X2,int Y2, /边框矩形右下角的逻辑坐标 int X3,int Y3, /椭圆弧起始经线的确定点坐标 int X4,int Y4 /椭圆弧终止经线的确定点坐标 ),7绘制矩形,

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号