《简单图形绘制与动态效果ppt课件》由会员分享,可在线阅读,更多相关《简单图形绘制与动态效果ppt课件(34页珍藏版)》请在金锄头文库上搜索。
1、.,面向对象程序设计课程设计实验项目,二、简单图形绘制与动态效果,.,通 知,每周课堂提问记入平时成绩。 第一阶段内容在第六周结束 第7周安排一次测验: 形式:笔试 内容:第三章至第七章。有关概念、程序设计。 本次布置的实验分两部分:必做和选做,.,建立程序“工程”的步骤(课本第二章),要求按照下列步骤规范执行 启动VC+,点击File/New菜单 Workspace: 建立工作区。取工作区名称,文件夹选择在E盘(为了有效地保存文档,不要使用默认文件夹) Project:建立工程。取工程名称(注意选择在“当前工作区”) File:建立源程序文件。取文件名。输入源程序。 编译、连接、运行。(了解
2、程序文件存放的物理位置) 使用MSDN查找API函数的使用方法: Help/Search: “活动子集”选择“Platform SDK”; “要查找的单词”输入相关API函数名,在“选择主题”中查找并双击该函数名,即可得到关于函数的说明、使用示例。,.,关于在工程中添加文件、在工作区中添加工程,请查阅课本P49,重点注意: 关于工作区面板“FileView”中树状组织与磁盘物理文件的关系 关于工作区中工程与工程文件的编辑 工具栏的设置,.,练习一 作图,对例4-1作如下修改,获得不同效果: 改变图形填充色:三种图形使用不同颜色; 改变图形外框线型; 在圆角矩形中画两条对角线;(参考例4-3)
3、在椭圆中画出长轴和短轴(轴长自定) 试在用户区中加画一个三角形(自己设计坐标,使用Polyline或Polygon) 思考:把画笔画刷语句注释后,是否可画图?,.,练习二:窗口刷新消息处理与用户区颜色变化,在课本程序3-1中的窗口函数WndProc增加语句,对windows发送过来的窗口刷新消息WM_PAINT进行处理,并用不同颜色刷新用户区。 认真阅读下列有关内容: 窗口变化后的刷新请求与刷新过程: 消息处理过程:(windows操作系统与窗口函数) 画图步骤:(见后页) 图形刷新的概念 画图的基本方法,图形刷新的概念、画图的基本方法:,(1) 刷新请求,(2) 系统对刷新请求的响应 当用户
4、区的内容需要刷新时,系统向应用程序消息队列发送WM_PAINT消息,系统在应用程序的消息队列中加入该消息,以通知窗口函数执行刷新处理,三种 刷新,窗口移动后的刷新 被覆盖区域的刷新 对象穿越后的刷新 (系统自动完成),用户区移动或显示 用户窗口大小改变 程序通过滚动条滚动窗口,窗口被另一个窗口覆盖的 恢复如下拉式菜单关闭等,光标穿过用户区 图标拖过用户区,窗口被另一个窗口覆盖的区域称为无效区域。 Windows系统为每个窗口建立了一个PAINTSTRUCT结构,该结构中包含了包围无效区域的一个最小矩形的结构RECT,应用程序可以根据这个无效矩形执行刷新操作。,Typedef struct ta
5、gPAINTSTRUCT HDC hdc;/设备描述表句柄 BOOL fErase;/一般取真值,表示擦除无效矩形的背景 RECT rcPaint;/无效矩形标识 BOOL fRestore;/系统保留 BOOL fIncUpdate;/系统保留 BYTE rgbReserved16;/系统保留 PAINTSTRUCT;,常用的Windows应用程序刷新窗口的方法,保存副本。刷新时将副本拷贝到相应的窗口中,记录事件。刷新时重新执行这个曾经发生的事件,重新绘制。将图形绘制处理程序放在消息WM_PAINT响应模块中,刷新时重绘图形,(3) 有效的刷新方法,.,消息处理过程,运行中的windows程
6、序,窗口程序,窗口操作,窗口message+窗口标识,显示结果,.,画图步骤,准备画轮廓的画笔 准备填充的画刷 Windows中每个对象都有“句柄”,画笔、画刷也是对象,也要通过“句柄”来使用 定义画笔、画刷的句柄变量: HPEN hPen; HBRUSH hBrush; 但hPen、hBrush还只是随机数,.,指定某种画笔、画刷给hPen,hBrush: hPen=CreatePen(PS_SOLID, 2, RGB(red, green, blue) ); hBrush=CreateSolidBrush( RGB(red,0,0) );,线型,线宽,线色,画刷颜色,.,画图的有关概念,谁
7、负责画图? Windows直接画? Windows通过一套称为“设备无关”的图形接口程序(GDI函数)进行画图 程序员的责任 把有关要求:笔、刷、图形、参数提供给GDI,.,设备描述表,记录各种作图要求与参数的数据结构 Windows在任一时刻都能为每个窗口提供用于作图的“设备描述表” 作图前一般都要先获取当前窗口的“设备描述表” 通过函数把作图所需的设备(画笔、画刷、图形、参数)“写入”设备描述表,也就是提供给GDI 调用GDI函数由GDI进行作图。,.,设备描述表的获取,设备描述表是一个对象,也要使用“句柄” HDChDC; /定义一个句柄 为hDC赋值: hDC=GetDC(hwnd);
8、/可用于各种消息处理时画图 或 hDC=BeginPaint(hwnd,/仅用于WM_PAINT 这两种方法各有不同的适用场合,处理非WM_PAINT消息时绘图,处理WM_PAINT消息时绘图,.,画图的程序写在哪里?,主要在对WMPAINT消息的处理中进行作图 图形刷新 画图程序设计的基本方法(思路) 画笔、画刷的定义、选入 图形参数的计算 调用作图函数,.,调用GDI绘图函数画图,画一个圆 画一个矩形 画一个饼 把整个用户区刷新:Rectangle(hdc,PtStr.rcPaint.left, PtStr.rcPaint.top, PtStr.rcPaint.right, PtStr.r
9、cPaint.bottom);,RECT类型:定义了一个矩形区域及其左上角和右下角的坐标,.,匈牙利表示法,变量名以一个或多个小写字母开始,这些小写字母表示变量的数据类型。 变量的后续字符描述变量的作用 如:szCmdLine,hInstance,hPen 变量名既描述了变量的作用,也描述了变量的数据类型 避免产生数据类型不匹配 及早发现错误,.,程序设计,在窗口函数WndProc中增加定义变量: HDC hdc; /设备描述表句柄 PAINTSTRUCT PtStr; /无效矩形变量 HBRUSH hbrush; /画刷句柄 static int r=0,g=0,b=0; /三原色,.,程序
10、设计,在处理WM_PAINT处写入下列程序,然后编译、连接、运行。 case WM_PAINT: hdc=BeginPaint(hwnd, 思考:窗口变化(放大、还原、移动、大小)有何不同?为什么?,.,改进效果:在窗口大小变化时也能对整个用户区进行刷新,增加对WM_SIZE消息的处理 case WM_SIZE: InvalidateRect(hwnd,NULL,TRUE); return 0; InvalidateRect函数的作用:使用户区失效,让windows产生一条WM_PAINT消息: InvalidateRect(hwnd,NULL,FALSE/TRUE) NULL:刷新整个用户区
11、;TRUE:清除用户区当前图像;,.,练习三 :移动的图形,以课本程序4-1为基础,增加刷新与程序暂停函数,使图形动起来。 图形能动的原因: 刷新后在另一个位置画图 增加一个图形位移变量x,每次画图后增量 x+=10; 使图形的坐标进行位移,如: RoundRect(hDC,50+x,120,100+x,200,15,15); 强制刷新: InvalidateRect(hwnd,NULL, TRUE); 控制刷新频率:Sleep(100); /强制程序暂停0.1秒 修改对WM_PAINT消息的处理,.,练习三:移动的图形,窗口函数开头的变量定义,增加: static int x=0; /思考:
12、为什么定义static? case WM_PAINT: hdc=BeginPaint(hWnd, /思考:为什么设300为限?加大一些行吗?,.,练习四:在鼠标单击时图形变化,单击鼠标产生鼠标消息WM_LBUTTONDOWN,WM_RBUTTONDOWN。在这些消息到达窗口函数时,强制刷新用户区,重新画图。 区分左右键画不同的图形:设两个标志变量 static int lbutt=1, rbutt=0; 在处理鼠标消息时更新这两个变量 处理WM_PAINT消息时要分别根据lbutt和rbutt的状态选择画不同的图形。,.,程序设计,窗口函数中增加变量定义 static int lbutt=1,
13、rbutt=0; 处理鼠标消息 case WM_LBUTTONDOWN: lbutt=1;rbutt=0; InvalidateRect(hWnd,NULL,1); return 0; case WM_RBUTTONDOWN: lbutt=0;rbutt=1; InvalidateRect(hWnd,NULL,1); return 0;,.,程序设计,选择画不同图形 if (lbutt=1) /按下左键画图形 else /按下右键画图形 ,.,实验任务五:以习题4-6为基础,分析、理解“习题”书的程序4-6,要求对46进行各方面的“探索”,产生不同的动态效果: 改变正弦波的幅度 小圆球的运动轨
14、迹变成筒状 小圆球上下运动 小圆球能重复运动或往复运动 按照实验报告要求完成任务,在网络课堂提交。,.,习题4-6的分析,正弦曲线的表现 连续曲线由离散点组成,点的密度影响曲线质量。 正弦曲线离散点的计算: POINT lpSin100;/存储正弦曲线点的坐标. for(int j=0;j100;j+) /生成正弦曲线点的坐标. lpSinj.x=(long)(j*2*Pi/100*60); lpSinj.y=(long)(dfRange*sin(j*2*Pi/100); 思考:默认的坐标原点在哪里?在用户区左上角。,一个周期的横坐标分为100等份 纵坐标(Y)的值有正负,怎么办?,.,对“负
15、值坐标”的处理,Y轴方向加一个振幅 POINT lpSin100;/存储正弦曲线点的坐标. for(int j=0;j100;j+) /生成正弦曲线点的坐标. lpSinj.x=(long)(j*2*Pi/100*60); lpSinj.y=(long)(dfRange*sin(j*2*Pi/100)+dfRange; 为了看清圆,在X、Y方向再加圆半径 lpSinj.x=(long)(j*2*Pi/100*60) +0.2*dfRange; lpSinj.y =(long)(dfRange*sin(j*2*Pi/100)+1.6*dfRange;,坐标计算放在消息循环之前,.,圆半径的变化:
16、振幅的0.20.6倍线性增长,在四分之一周期内变化:每个周期100个点,四分之一周期是25个点。 在25个点内圆半径从0.2dfRange0.6dfRange:使用差分方法计算. lRadious= (long)(dfRange*0.2+i%25*dfRange*0.4/25);,作用? 25个点一循环 可否改变i变量的全局性,.,图像暂留与刷新,Sleep() 程序暂停 InvalidateRect(hWnd,NULL,1) 刷新用户区中的指定区域: 第二参数为空:刷新整个用户区 第三参数的作用?,.,实验任务六:以习题4-7为基础,以47为基础,产生霓虹灯效果 提示:每隔一定时间改变每个图形的画刷,重新画图。 方法一:定义“画刷”数组,有规律地在不同时刻取不同的画刷画图,由此产生“图形流动”的感觉。 方法二:认真阅读习题4-9,学习用4-9的方法实现霓虹灯效果。 按照实验报告要求完成任务,在网络课堂提交。,.,拓展设计: 选作,主题设计:运用图形、文字,展现一个主题效果。例如: 静静的小河 池塘