Windows的图形设备接口及.ppt

上传人:枫** 文档编号:568401787 上传时间:2024-07-24 格式:PPT 页数:22 大小:203.96KB
返回 下载 相关 举报
Windows的图形设备接口及.ppt_第1页
第1页 / 共22页
Windows的图形设备接口及.ppt_第2页
第2页 / 共22页
Windows的图形设备接口及.ppt_第3页
第3页 / 共22页
Windows的图形设备接口及.ppt_第4页
第4页 / 共22页
Windows的图形设备接口及.ppt_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《Windows的图形设备接口及.ppt》由会员分享,可在线阅读,更多相关《Windows的图形设备接口及.ppt(22页珍藏版)》请在金锄头文库上搜索。

1、第3章Windows的图形设备接口及Windows绘图主要内容 图形设备接口 绘图工具与颜色 常用绘图函数习题: 4-6,4-84.1 4.1 图形设备接口图形设备接口 图形设备接口(GDI,Grophlcs Devlce Interface) 负责加载相应的设备驱动程序,控制在输出设备上显示图形、文字,提供与设备无关的绘图工具。4.1.1 4.1.1 图形处理的基本概念图形处理的基本概念l用户(客户)区 除了窗口边框之外的中间空白区。l设备环境 (Device Context(Dc)或设备上下文、设备描述符表)相当于画布,把应用程序与设备驱动相联的一种数据结构,每个设备必须配备一个设备环境。

2、Dc定义了图形对象及其属性的结构(表4-l、表4-2)。图形对象及其属性:图形模式及其输出,设备输出区域、画笔、画刷、选择的字体和颜色、目标映射方式等。l创建设备环境 应用程序不不能能直直接接存存取取设设备备环环境境,只能使用设备环境句柄标识设备,间接存取设备环境及其属性。l释放设备环境 应用程序访问结束时,要释放设备环境句柄(资源)。 4.1.2 4.1.2 图形刷新图形刷新 绘图变化显示需要图形刷新,如用户区绘制了一个椭圆,并在其上显示一个颜色列表框,列表框覆盖了椭圆的一部分,当用户关闭列表框后,要用图形刷新恢复椭圆被覆盖部分的颜色和形状。 刷新过程:包括刷新请求、系统对刷新的响应以及刷新

3、方法。l刷新请求 当用户区的内容需要刷新时,系统在应用程序的消息队列中加入WM_PAINT消息,通知窗口函数执行刷新处理。l系统对刷新响应的条件 窗口移动后(如下),系统向应用程序发送WM_PAINT消息:用户区移动或显示。用户窗口大小改变。通过滚动条滚动窗口。窗口第一次显示 在执行ShowWindow函数后,调用函数UpdateWindow更新绘制客户区,发出WM_PAINT消息,实现重画客户的内容。被覆盖区域的刷新 当下例事件发生时,Windows系统将恢复保存的被覆盖区域:下拉式菜单关闭。清除对话框或消息框等对象。被另一个窗口覆盖的区域(称为无效区域),无效区域的产生可导致系统向应用程序

4、发送一条消息。系统为每个窗口建立了一个PAINTSTRUCT结构,该结构变量将记录一个最小矩形(无效区域)的结构RECT,应用程序是无效矩形执行刷新操作。对象穿越后的刷新光标穿过用户区。图标拖过用户区。 对象穿越后,Windows自动完成刷新,应用程序不考虑。 l 刷新的常用方法对于简单图形,采用重新绘制图形方法执行刷新。在应用程序中,将图形绘制处理程序放在消息WM_PAINT响应模块中,一旦程序接收到刷新请求即可重绘图形。记录曾发生的事件,在需要刷新时重新调用窗口执行这个事件。位图等复杂图形刷新,是在内存中保持一个显示输出的副本,当需要重绘窗口时,将副本复制到相应的窗口中。4.1.3 4.1

5、.3 获取设备环境句柄获取设备环境句柄 输出图形必须先获取设备环境句柄(3种方法) 1调用BeginPaint函数获得设备环境句柄 如:如:hdchdcBeginPaintBeginPaint(hwndhwnd,psps););其中:其中:hwndhwnd-访问设备环境的应用程序窗口句柄; psps-指向变量ps的指针。 psps是结构类型PAINTSTRUCT的变量,定义方式为: PAINTSTRUCT psps结构类型PAINTSTRUCT Windows系统提供的标识无效区域的结构,在WINDOW.H中定义: typedef struct tagPAINTSTRUCT HDC hdc;

6、/ 设备环境句柄 BOOL fErase ; / 确定背景是否被重新绘制,一般取真值,表示擦除无效矩形的背景 RECT rcPaint;/无效区域(标识重绘的区) BOOL fRestore; /保留字段 BOOL fIncUpdate; /保留字段 BYTE rgbReserved16;/保留字段 PAINTSTRUCT; 系统调用BeginPaintBeginPaint 时,填写psps结构以标识需要刷新的无效区,为实现重绘提供记录。 rcPaint为RECT数据结构的变量,标识无效矩形。RECT结构定义: typedef struct tagRECT LONG left; /矩形框左上角

7、x坐标 LONG top; /矩形框左上角Y坐标 LONG right; /矩形框右上角X坐标 LONG bottom ;/矩形框右上角Y坐标 RECT; 释放设备环境,用EndPaint函数,其原型为: BOOL EndPaint(HWND hwnd,PAINTSTRUCT ps)2调用GetDC函数 适应绘图不是由WM_PAINT消息驱动,或对整个客户区及客户区之外进行重画的情况。GetDC函数的原型声明:hdchdc= =GetDCGetDC(hwndhwnd); ;ReleaseDC 释放设备环境,函数原型: ReleaseDC(hwndReleaseDC(hwnd) )。3调用Get

8、DCEx函数 GetDCEx函数返回指向特定窗口的客户区或整个窗口的句柄,是GetDC的扩展。它的释放也是用ReleaseDC函数。4.1.4 4.1.4 映射模式(坐标系设置)映射模式(坐标系设置)1坐标系统与映射模式 坐标系:逻辑、设备坐标系(属于物理坐标系)。逻辑坐标系 绘画操作的虚拟空间坐标。除了MMTEXT映射方式外,映射方式的原点为左下角左下角,应用程序使用逻辑坐标。设备坐标 显示器上的坐标系,以像素点表示度量单位,原点为左左 上上 角角 , 右 下 角 的 坐 标 与 分 辩 率 有 关 , 如 ( 640,480) 、(800,600)、(1024,768)等。由由GetSys

9、temMetrics(SM_CXSCREENGetSystemMetrics(SM_CXSCREEN) )取得屏幕宽度;取得屏幕宽度;由由GetSystemMetrics(SM_CYSCREENGetSystemMetrics(SM_CYSCREEN) )取得屏幕高度。取得屏幕高度。设备坐标的三种类型 屏幕坐标 使用整个屏幕作为坐标区域。 窗口坐标 使用边界在内的窗口作为坐标区域。 用户区坐标 窗口内不含窗边的区域,不含菜单条、滚动条等。映射模式 因应用程序做图以点为单位,在显示器或打印机的输出(单位不同)比例不合适,只有将逻辑坐标转化到设备坐标系中,才能在视口(使用设备坐标的窗口)中显示输出

10、图形,或在打印机上打印。Windows中的映射模式有九种,如表4-4所示,默认模式是MM_TEXT。 2映射模式的设置(1)设置映射模式函数 SetMapMode(hdc,nMapMode) /nMapMode为表4_4的映射模式:(前2个为非约束映射模式) MM_ANISOTROPIC:x、y方向使用自定义的长度单位,x、y单位可不同,单位由SetWindowExtEx和SetViewportExtEx确定 ; MM_ISOTROPIC: x、y方向使用自定义的长度单位,x、y单位相同,单位由SetWindowExtEx和SetViewportExtEx确定 ; MM_TEXT :以像素为单

11、位,原点为左上角; MM_TWIPS:以1/1440英寸为单位,原点为左下角; MM_HIENGLISH:以0.001英寸为单位,原点为左下角; MM_HIMETRIC:以0.01毫米为单位,原点为左下角; MM_LOENGLISH:以0.01英寸为单位,原点为左下角; MM_ LOMETRIC:以0.1毫米为单位,原点为左下角;(2)获取当前设备环境的映射模式函数 nMapMode = GetMapMode (hdc);以代码的形式获得(3) 窗口区域的定义函数BOOL SetWindowExtEx ( HDC hdc, int nHeight, / nHeight为新窗口区域高度(逻辑单位

12、) int nWidth, / nWidth 为新窗口区域宽度(逻辑单位) LPSIZE lpSize ) /lpSize为保存函数调用前窗口区域尺寸的SIZE结构地址,如果取NULL则表示忽略调用前的尺寸 (4)视口(设备坐标的窗口)区域定义函数 BOOL SetViewportExtEx ( HDC hdc, int nHeight, /nHeight为新视口区域高度(设备单位) int nWidth, /nWidth为新视口区域宽度(设备单位) LPSIZE lpSize )/lpSize为保存函数调用前视口区域尺寸的SIZE结构地址,如果取NULL,则表示忽略调用前的尺寸 (5) 设定

13、窗口的原点函数 SetWindowOrgEx函数的原型为: BOOL SetWindowOrgEx ( HDC hdc, int X, / X和Y为窗口内绘图的新原点坐标(逻辑单位) int Y, LPPOINT lpPoint )/lpPoint为保存函数调用前原点坐标的POINT结构的地址,取NULL则忽略调用前的尺寸(6)设定视口的原点函数 SetViewportOrgEx函数的原型为: BOOL SetViewportOrgEx ( HDC hdc, int X, / X和Y为视口内绘图的新原点坐标(设备单位) int Y, LPPOINT lpPoint /lpPoint为保存函数调

14、用前原点坐标的POINT结构的地址,取NULL则忽略调用前的尺寸 )3. 窗口坐标与视区坐标的转换(1)窗口坐标与视口坐标的转换关系 从窗口坐标(xWin,yWin)到视口坐标(xView,yView)的转换公式: xView= xView Org+(xWin xWinOrg) xViewExt/ xWinExt yView= yView Org+(yWin yWinOrg) yViewExt/ yWinExt其中:(xView Org, yView Org)、(xWinOrg,yWinOrg )是视口、窗口的坐标原点。xViewExt/ xWinExt 、 yViewExt/ yWinExt

15、 是视口坐标和窗口坐标的转换比例。(2)物理坐标转逻辑坐标函数 应用程序从视口坐标转换为窗口坐标时,使用转换函数DPtoLP: DPtoLPDPtoLP(hdchdc,&Point&Point,sizeof(Pointsizeof(Point) )sizeof(POINTsizeof(POINT) ));); hdchdc 设备环境句柄; &Point &Point 要转换的POINT结构数组的地址; sizeof(Pointsizeof(Point) )sizeof(POINTsizeof(POINT) ) 要转换的POINT结构个数。(3)逻辑坐标转物理坐标函数 LPtoDPLPtoDP(

16、hdchdc,&Point&Point,sizeof(Pointsizeof(Point) )sizeof(POINTsizeof(POINT) )););hdchdc 设备环境句柄; &Point &Point 要转换的POINT结构数组的地址; sizeof(Pointsizeof(Point) )sizeof(POINTsizeof(POINT) ) 要转换的POINT结构个数。4.2 4.2 绘图工具与颜色绘图工具与颜色 Windows绘图使用画笔和画刷,画笔的功能是画直线和曲线,画刷用于指定区域的填充。4.2.1 4.2.1 画笔画笔 画笔的操作过程:创建画笔、将画笔选入设备环境、删

17、除画笔1.画笔的创建先定义一个画笔句柄变量: HPEN hP;调用函数GetStockObject获取画笔句柄, Windows系统定义的4种画笔: WHITE_PEN,BLACK_PEN,DC_PEN,NULL_PEN 其中:DC_PEN为98之后的一种笔,颜色由SetDCPenColor函数设置.例:获取画笔BLACK_PEN的句柄: hP=(HPEN)GetStockOhject(BLACK_PEN);创建新的画笔 创建新的画笔的函数原型: hP=CreatPen ( int nPenStyle, /确定画笔样式,可选样式及说明如表4_5所示 int nWidth, /画笔宽度取0表示一

18、个像素宽 COLORREF rgbColor /画笔颜色 ); 2将画笔选入设备环境 将画笔选入设备环境函数形式如下: hPenOld=SelectObject(hdc,hP); / hP为所创建或获取的画笔句柄 3删除画笔 删除画笔,先调用函数SelectObject恢复原来系统的画笔(如果必要的话),函数形式如下: SelectObject(hdc, hPenOld);/ hPenOld为系统原有的画笔 DeleteObject(hP);4.2.2 4.2.2 画刷画刷 1画刷的创建 定义一个画刷句柄变量: HBRUSH hBr; hBr为画刷句柄 调用函数GetStockObject获取

19、Windows系统提供的画刷,形式: hBr=(HBRUSH) GetStockObject(nBrushStyle); / nBrushStyle 为画刷样式,见表4-6调用函数CreateSolidBrush创建一个具有指定颜色的单色画刷。 hBr= CreateSolidBrush(rgbColor); / rgbColor为画刷颜色调用函数CreateHatchBrush创建具有指定阴影图案和颜色的画刷,其调用形式: hBr=CreateHatchBrush ( int nHatchStyle,/nHatchStyle为阴影模式标识,详见表4-7 COLORREF rgbColor /

20、画刷颜色 );2选入设备环境 选入设备环境调用SelectObject函数。其形式: hBrOld=SelectObject(hdc,hBr); SelectObject函数返回值中保存上一次使用的画刷句柄hBrOld。3删除画刷 删除画刷用函数DeleteObject ,删除前应调用函数SelectObject恢复系统原有的画刷(如果必要的话),其形式为: SelectObject(hdc,hBrOld); DeleteObject(hBr);4.2.3 4.2.3 颜色颜色 Windows系统使用32位无符号整数表示颜色,如图4-1所示,32位整数中的低三位字节分别表示红、绿、蓝三个颜色值

21、,每一个颜色值的范围是O-255。 Windows使用宏RGB定义绘图的颜色,其形式为: RGB(nRed,nGreen,nBlue) 其中nRed,nGreen,nBlue分别表示红色值、绿色值和蓝色值。例:RGB(25 5,O,0)表示红色, RGB(0,255,O)代表绿色, RGB(0,O,255)为蓝色。 4.3 4.3 常用绘图函数常用绘图函数 1 1设置画笔当前位置的函数设置画笔当前位置的函数MoveToExMoveToEx 原型: B00L MoveToEx ( HDC hdc, int X, / X,Y分别为新位置的逻辑坐标 int Y, LPPOINT lpPoint /

22、lpPoint为存放原画笔位置的POINT结构地址 2 2从当前位置向指定坐标点画直线的函数从当前位置向指定坐标点画直线的函数LineToExLineToEx 原型: BOOL LineToEx(HDC hdc,int X, int Y) /其中X和Y为线段的终点坐标 3 3从当前位置开始从当前位置开始, ,依次用线段连接依次用线段连接IpPointsIpPoints中中指定各点的函数指定各点的函数PolyLinePolyLine 原型: BooL PolyLine ( HDC hdc, LPPOINT lpPoints,/ lpPoints为指向包含各点坐标的P0INT结构数组的指针 int

23、 nCount / nCount 为POINT数组中点的个数 ) 4 4绘制椭圆弧线的函数绘制椭圆弧线的函数ArcArc 函数原型: BOOL Arc ( HDC hdc, int X1, int Y1, /指定边框矩形左上角的逻辑坐标 int X2, int Y2, /指定边框矩形右下角的逻辑坐标 int X3, int Y3, /椭圆弧起始径线的确定点坐标 int X4, int Y4 ) /椭圆弧终止径线的确定点坐标Arc函数所画的椭圆弧线由给定矩形边框定义, 在左上角坐标(X1,Y1)和右下角坐标(X2,Y2)确定。该弧的起点是(X3,Y3)和矩形中心的连线与椭圆的交点,终点为(X4,

24、Y4)和矩形中心的连线与椭圆的交点。弧是从起点向终点逆时针画出图4-1。5 5使用当前画笔使用当前画笔给制一个制一个饼图并使用当前画刷并使用当前画刷进行填充的函数行填充的函数PiePie 函数原型: BOOL Pie ( HDC hdc, int X1, int Y1, /指定边框矩形左上角的逻辑坐标 int X2, int Y2, /指定边框矩形右下角的逻辑坐标 int X3, int Y3, /椭圆弧起始径线的确定点坐标 int X4, int Y4 ) /椭圆弧终止径线的确定点坐标 Pie函数所画饼图为椭圆弧线和两条径线所围的区域,如图4-2。 6.6.用画笔绘制一个矩形,并使用画刷进行

25、填充的函数用画笔绘制一个矩形,并使用画刷进行填充的函数RectangleRectangle函数原型:BOOL Rectangle ( HDC hdc, Xl,int Y1, /(X1,Y1)为矩形的左上角的逻辑坐标 int X2 int Y2) /(X2,Y2)为矩形的右下角的逻辑坐标7 7使用画笔绘制一个圆角矩形,并使用画刷填充的函数使用画笔绘制一个圆角矩形,并使用画刷填充的函数RoundRectRoundRect 函数原型: BOOL RoundRect (HDC hdc, int X1,int Y1, /(X1,Y1)为矩形左上角的逻辑坐标 int X2,int Y2, /(X2,Y2)

26、为矩形右下角的逻辑坐标 int nWidth, /nWidth为圆角的宽度 int nHeight /nHeight为圆角的高度 )8.8.使用当前画笔绘制一个椭圆,井使用当前画刷填充的函数使用当前画笔绘制一个椭圆,井使用当前画刷填充的函数EllipseEllipse 函数原型: BOOL Ellipse ( HDC hdc, int X1,int Y1, /(X1,Y1)为边界矩形左上角的逻辑坐标 int X2, int Y2 ) /(X2,Y2)为边界矩形右下角的逻辑坐标9.9.使用当前画笔绘制一个多边形,并使用当前画刷填充的函数使用当前画笔绘制一个多边形,并使用当前画刷填充的函数Poly

27、gonPolygon 函数原型: BOOL Polygon ( HDC hdc, LPPOINT lpPoints, /lpPoints为包含各点坐标的POINT数组的地址 int nCount /nCount为多边形点的个数 )4 44 4应用实例应用实例例3-1:利用绘图函数创建填充区。共有三个填充图形,第一个是 用深灰色画刷填充带圆角的矩形,第二个是采用亮灰色画刷填充一个椭圆形图,第三个是用虚画刷填充饼形图。窗口函数处理的几个消息说明:窗口函数处理的几个消息说明:(1 1) WMWMCREATECREATE消息消息 当窗口生成显示时,将响应WMCREATE消息。 (2 2)WM_PAIN

28、TWM_PAINT消息消息lWM_PAINT(绘画)消息是窗口函数应处理的第一种消息,相应操作是为更新而准备用户区。l产生WM_PAINT消息的条件第一条第一条 WM_PAINTWM_PAINT消息,在更新窗口时,由消息,在更新窗口时,由UpdateWindowsUpdateWindows()()发出外发出外; 改变窗口大小(窗口被创建、移动、改变大小、从图标状态下恢复);覆盖用户区的菜单或对话框等无效区关闭时;调用ScrollWindow函数(卷起);调用函数InvalidateRect或InvalidateRgn。lInvalidateRectInvalidateRect和和Invalid

29、ateRgnInvalidateRgn函数的说明函数的说明 InvalidateRect和InvalidateRgn函数,把用户区标记为无效而要求重新显示,强迫产生一条WM_PAINT消息。InvalidateRect(与InvalidateRgn类似)函数原型说明:void InvalidateRect(HWND hwnd,const RECT FAR * lprc,BOOL fErase); HwndHwnd- 窗口句柄;LprcLprc-指定窗口客户区内矩形区域标记为无效,若lprc为NULL,将整个客户区域标记为无效;fErasefErase -擦除背景标志,若Eerase为TRUE,则擦除无效区域背景,否则不擦除。 例如:InvalidateRect(hwnd,NULL,TRUE); /将整个客户区域标记为无效,重新绘制时,将擦除背景。如 果 想 改 变 重 新 显 示 的 用 户 区 , 可 以 调 用 ValidateRgn或ValidateRect函数,使相应用户区域有效,这两个函数取消原先标记的无效区域,并在没有无效区域的情况下,取消队列中的WM PAINT消息。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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