(本科)第9章 图形程序设计ppt课件.ppt

上传人:春哥&#****71; 文档编号:15607963 上传时间:2022-05-13 格式:PPT 页数:36 大小:145.50KB
返回 下载 相关 举报
(本科)第9章 图形程序设计ppt课件.ppt_第1页
第1页 / 共36页
(本科)第9章 图形程序设计ppt课件.ppt_第2页
第2页 / 共36页
点击查看更多>>
资源描述

《(本科)第9章 图形程序设计ppt课件.ppt》由会员分享,可在线阅读,更多相关《(本科)第9章 图形程序设计ppt课件.ppt(36页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、课程主讲人:第9章 图形程序设计中国铁道出版社中国铁道出版社张思民等主编张思民等主编C+C+语言程序设计语言程序设计第第 9 9 章章 图形程序设计图形程序设计本章内容n9.1设备描述符和图形设备接口n9.1.1 windows下图形绘制特点n设备描述符n9.2 GDI基本绘图工具的使用n9.2.1 画笔工具n画刷工具n9.2.3 颜色的设置n9.3 GDI常用绘图函数n图形区域的绘图函数n9.3.2 填充图形内部区域的绘图函数n9.4 图形设计应用9.1 9.1 设备描述符和图形设备接口设备描述符和图形设备接口9.1.1 windows下图形绘制特点下图形绘制特点在Windows中,只能在窗

2、口的显示区域绘制文字和图形,而且不能确保在显示区域内显示的内容会一直保留在那里。例如,使用者可能会在屏幕上移动另一个程序的窗口,这样就可能覆盖应用程序窗口的一部分。Windows不会保存窗口中被其它程序覆盖的区域,当其它的窗口移开后,Windows会要求程序更新显示区域的这个部分。9.1.2 设备描述符设备描述符设备描述符是一种数据结构,它包括了一个设备(如显示器和打印机)的绘制属性相关的信息。所有的绘制操作都是API函数通过访问设备描述符进行。设备描述符总是与某种系统硬件设备相关。比如屏幕设备描述符与显示设备相关,打印机设备描述符与打印设备相关等等。 上图是windows图形系统结构原理图,

3、从这个结构图中可以看出,应用程序如果要进行绘图操作,首先是要得到设备的描述符(DC)才可以进行。 【例9-1】获取设备描述符并绘制简单图形获取设备描述符并绘制简单图形LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) HDC hdc ;/定义定义DC句柄句柄 PAINTSTRUCT ps ;/定义绘图信息结构定义绘图信息结构 RECT rect ;int cxClient;intcyClient; switch (message)/分别各种处理消息分别各种处理消息 case WM_CR

4、EATE:return 0 ; case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rect) ; cxClient=;cyClient=; Rectangle (hdc,cxClient / 4,cyClient / 4,cxClient *3/ 4, cyClient *3/ 4);Ellipse(hdc,cxClient / 4,cyClient / 4,cxClient *3/ 4, cyClient *3/ 4);EndPaint (hwnd, &ps) ;/结束绘图结束绘图return 0 ; case

5、 WM_DESTROY:/退出消息循环退出消息循环PostQuitMessage (0) ;return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ;在这个例子中演示了windows取得设备文本的基本方法,Windows提供了几种取得设备内容句柄的方法,这里演示的最基本的一种方法。也就是在处理WM_PAINT消息时,使用BeginPaint和EndPaint函数得到当前的设备描述符(程序的第14行21行)其获得设备描述符句柄的方法由以下的语句来完成:hdc = BeginPaint(hwnd, &ps);hdc = Beg

6、inPaint(hwnd, &ps); EndPaint(hwnd, &ps); EndPaint(hwnd, &ps); 9.2 GDI9.2 GDI基本绘图工具的使用基本绘图工具的使用9.2.1 画笔工具画笔工具Windows画线或画点的时候是使用设备描述符中目前选中的“画笔”来绘制的。画笔决定线的色彩、宽度和画笔样式,画笔样式可以是实线、点划线或者虚线,内定设备内容中画笔为BLACK_PEN。这种画笔都画出一个图素宽的黑色实线来。Windows程序以句柄来使用画笔,Windows表头文件WINDEF.H中包含一个叫做HPEN的型态定义,即画笔的句柄。1、画笔的创建、画笔的创建定义完成以后

7、可以调用函数GetStockObject来得到windows定义的四种画笔:这四种画笔分别是WHITE_PEN,BLACK_PEN,DC_PEN,NULL_PEN。如果程序想得到windows定义的黑色画笔,就可以使用以下的语句: 在使用画笔之前,要先定义一个画笔的句柄,其定义的形式如下:HPEN hPen ; hPen = GetStockObject (BLACK_PEN) ;hPen = GetStockObject (BLACK_PEN) ; 也可以根据程序设计需要自定义一个新的画笔,创建新画笔的函数构造形式如下:hPen CreatePen(int nPenStyle, / 画笔的样

8、式,见样式表 int nWidth /画笔的宽度,以像素为单位 COLORREF rgbColor /画笔的颜色 ); 定义变量说明PS_DASH虚线PS_DASHDOT点划线PS_DASHDOTDOT双点划线PS_DOT点线PS_INSIDEFRAME边框线PS_NULL空线PS_SOLID实线画笔的样式表2、使画笔生效、使画笔生效使用SelectObject函数,把画笔句柄选入设备的描述表中: SelectObject (hdc, hPen);调用了该函数以后,程序就会使用hPen句柄所指定的画笔来绘图,直到程序又选中了其它的画笔为止,这个函数的返回值是上次使用的画笔的句柄。3、删除画笔、

9、删除画笔DeleteObject(hPen);画刷工具画刷工具画刷是一种用指定的图样来填充对应区域的工具,图形是以目前设备描述符中选择的画刷来填入的。Windows定义了六种画刷:WHITE_BRUSH /白画刷LTGRAY_BRUSH /亮灰色画刷 GRAY_BRUSH /灰色画刷 DKGRAY_BRUSH /深灰色画刷 BLACK_BRUSH /黑色画刷NULL_BRUSH /空画刷 1、画刷的创建、画刷的创建先定义一个画刷句柄变量:HBRUSH hBrush;然后可以调用GetStockObject函数来取得一个画刷,以GRAY_BRUSH为例:hBrush=GetStockObject

10、(GRAY_BRUSH);hBrush=GetStockObject(GRAY_BRUSH);也可以调用函数GreateSolidBrush创建一个具有指定颜色的单色画刷,调用形式如下:hBrush =GreateSolidBrush(rgbCol); hBrush =GreateSolidBrush(rgbCol); 其中,rgb为画刷的颜色 是一个COLORREF类的对象。另外的一个函数GreateHatchBrush可以创建一个具有指定阴影图案和颜色的画刷,其调用的形式如下:hBrush=GreateHatchBrush(hatchStyle,rgbCol)hBrush=GreateHa

11、tchBrush(hatchStyle,rgbCol) 其中,hatchStyle为画刷模式,rgb为画刷的颜色 是一个COLORREF类的对象。 画刷的模式 模式说明HS_BDIAGONAL45度从左上角到右下角的阴影线HS_DIAGCROSS45度交叉线HS_FDIAGONAL45度从左下角到右上角的阴影线HS_CROSS垂直相交的阴影线HS_HORIZONTAL水平阴影线HS_VERTICAL垂直阴影线2、使画刷生效创建完画刷以后,必须调用SelectObject函数将其选入设备描述符中,其形式如下:SelectObjectSelectObject(hdc,hBrushhdc,hBrus

12、h);); 3、删除画刷如果使用完画刷以后,就可以调用函数DeleteObject来将画刷删除,以达到释放内存,消除内存泄漏的目的。9.2.3 颜色的设置颜色的设置颜色在windows中是使用的一个32位的无符号数来表示的,这个数字的24位32位是0,而低三位分别表示红、绿、蓝三个颜色值,也就是32位数的第07位表示蓝色的因子,第815位表示绿色的因子,第1623位表示红色的因子。以8位来计算范围是0255。Windows使用宏RGB定义颜色:RGB(red,green,blue)RGB(red,green,blue) 这个宏定义中red,green,blue分别是表示红,绿,蓝三原色的分量,

13、根据这三种分量的不同值,可以得到不同的颜色。 【例【例9-2】画笔画刷以及颜色的设定方法】画笔画刷以及颜色的设定方法LRESULT CALLBACK WndProc()LRESULT CALLBACK WndProc() case WM_PAINT:case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; hdc = BeginPaint (hwnd, &ps) ; hPen=CreatePen(PS_DASH,0,NULL); hPen=CreatePen(PS_DASH,0,NULL); SelectObject (hdc, hPen); SelectOb

14、ject (hdc, hPen); MoveToEx (hdc, 50, 50, NULL) ; MoveToEx (hdc, 50, 50, NULL) ; LineTo (hdc, 150, 50) ; LineTo (hdc, 150, 50) ; TextOut(hdc,160,45,TEXT(PS_DASH),strlen(PS_DASH); TextOut(hdc,160,45,TEXT(PS_DASH),strlen(PS_DASH); DeleteObject(hPen); DeleteObject(hPen);/创建画笔为点线创建画笔为点线hPen=CreatePen(PS_

15、DOT,0,NULL);hPen=CreatePen(PS_DOT,0,NULL);SelectObject (hdc, hPen);SelectObject (hdc, hPen);MoveToEx (hdc, 50, 120, NULL) ; MoveToEx (hdc, 50, 120, NULL) ; LineTo (hdc, 150, 120) ;LineTo (hdc, 150, 120) ;TextOut(hdc,160,120,TEXT(PS_DOT),strlen(PS_DOT);TextOut(hdc,160,120,TEXT(PS_DOT),strlen(PS_DOT);

16、DeleteObject(hPen); DeleteObject(hPen); hPen=CreatePen(PS_SOLID,0,NULL); hPen=CreatePen(PS_SOLID,0,NULL); hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0); hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0); SelectObject(hdc,hBrush); SelectObject(hdc,hBrush); SelectObject(hdc,hPen); SelectObject(hdc

17、,hPen); Rectangle(hdc,300,30,400,70); Rectangle(hdc,300,30,400,70); TextOut(hdc,410,50,TEXT(HS_BDIAGONAL),strlen(HS_BDIAGONAL); TextOut(hdc,410,50,TEXT(HS_BDIAGONAL),strlen(HS_BDIAGONAL); DeleteObject(hBrush); DeleteObject(hBrush); / /创建画刷为垂直相交的蓝色阴影线创建画刷为垂直相交的蓝色阴影线hBrush=CreateHatchBrush(HS_CROSS,NU

18、LL);hBrush=CreateHatchBrush(HS_CROSS,NULL);SelectObject(hdc,hBrush);SelectObject(hdc,hBrush);Rectangle(hdc,300,100,400,150);Rectangle(hdc,300,100,400,150);TextOut(hdc,410,120,TEXT(HS_CROSS),strlen(HS_CROSS);TextOut(hdc,410,120,TEXT(HS_CROSS),strlen(HS_CROSS);DeleteObject(hBrush);DeleteObject(hBrush)

19、; DeleteObject(hPen); DeleteObject(hPen); EndPaint (hwnd, &ps) ; EndPaint (hwnd, &ps) ; return 0 ; return 0 ;9.3 GDI9.3 GDI常用绘图函数常用绘图函数图形区域的绘图函数图形区域的绘图函数1 1、画点函数、画点函数(1)SetPixel函数的原型如下:COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);其中,n hdc:设备描述符句柄。nX:指定要设置的点的X轴坐标。nY:指定要设置的点的Y轴坐标。n crCol

20、or:指定要用来绘制该点的颜色。 返回值:如果函数执行成功,那么返回值就是函数设置像素的RGB颜色值。(2) GetPixel函数的原型如下:函数的原型如下:COLORREF GetPixel(HDC hdc, int nXPos, int nYPos); 其中,n hdc:设备描述符句柄。nnXPos:指定要检查的像素点的逻辑X轴坐标。n nYPos:指定要检查的像素点的逻辑Y轴坐标。函数功能:该函数检索指定坐标点的像素的RGB颜色值。返回值:返回值是该象像点的RGB值。2、 绘制椭圆的函数绘制椭圆的函数ArcBOOL Arc( HDC hdc,/ DC句柄 int nLeftRect,/

21、包容矩形左X值 int nTopRect,/ 包容矩形顶Y值 int nRightRect,/ 包容矩形右X值 int nBottomRect,/ 包容矩形底Y值 int nXStartArc,/ 第一点X坐标 int nYStartArc,/ 第一点Y坐标 int nXEndArc,/ 结束点X坐标 int nYEndArc/ 结束点Y坐标 ); 3、从当前坐标点画直线到指定坐标点的函数 BOOL LineTo(HDC hdc,/ DC句柄int nXEnd, / 结束点的X坐标 int nYEnd / 结束点的Y坐标 ); 4、设置画笔当前位置的函数BOOL MoveToEx (HDC h

22、dc,/ DC句柄int X, / 结束点的X坐标 int Y, / 结束点的Y坐标 LPPOINT lpPoint /原画笔的POINT结构地址 ); 5、绘制一个多边形(不填充)的函数、绘制一个多边形(不填充)的函数BOOL Polyline( HDC hdc, / dc句柄 CONST POINT *lppt, / 多边形绘制结束点 int cPoints / 数据中的结束点的数目 ); 【例9-3】用多边形函数绘制正弦函数曲线图形。LRESULT CALLBACK WndProc () case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; /得到设

23、备描述符 MoveToEx (hdc, 0, cy / 2, NULL) ; LineTo (hdc, cx, cy / 2) ; for (i = 0 ; i NUM ; i+) apti.x = i * cx / NUM ;apti.y = (int) (cy / 2 * (1 - sin (TWOPI * i / NUM) ; Polyline (hdc, apt, NUM) ; return 0 ; EndPaint (hwnd, &ps) ; 9.3.2 填充图形内部区域的绘图函数填充图形内部区域的绘图函数1、填充矩形函数Rectangle( );2、填充椭圆函数Ellipse( )

24、;3、填充圆角矩形函数 RoundRect( );4、填充饼图函数Pie( );5、多边形函数Polygon( );填充区域的一般步骤如下:(1)先定义一个画刷句柄变量:HBRUSH hBrush ; (2)通过调用GetStockObject来取得相应的画刷句柄(这里是GRAY_BRUSH),也可以自己创建画刷来得到句柄。hBrush = GetStockObject(GRAY_BRUSH) ; (3)调用SelectObject将它选进设备描述符:SelectObject(hdc, hBrush) ; (4)最后调用上面的绘图函数,则图形内部区域将被指定画刷填充。9.4 9.4 图图 形形 设设 计计 应应 用用【例【例9-4】绘制一个小球沿着一定的曲线运动的简单动画。】绘制一个小球沿着一定的曲线运动的简单动画。1、系统自动生成程序框架的代码 2、修改的消息处理函数 WndProc( )(1)获取设备描述符(2)绘制正弦曲线(3)以Polyline绘制sin多边形(4)创新画笔(5)画圆(6)结束绘图本章小结本章小结

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

当前位置:首页 > 教育专区 > 大学资料

本站为文档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