简单图形绘制与动态效果.ppt

上传人:小飞机 文档编号:6139440 上传时间:2023-09-28 格式:PPT 页数:34 大小:205.50KB
返回 下载 相关 举报
简单图形绘制与动态效果.ppt_第1页
第1页 / 共34页
简单图形绘制与动态效果.ppt_第2页
第2页 / 共34页
简单图形绘制与动态效果.ppt_第3页
第3页 / 共34页
简单图形绘制与动态效果.ppt_第4页
第4页 / 共34页
简单图形绘制与动态效果.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《简单图形绘制与动态效果.ppt》由会员分享,可在线阅读,更多相关《简单图形绘制与动态效果.ppt(34页珍藏版)》请在三一办公上搜索。

1、面向对象程序设计课程设计实验项目,二、简单图形绘制与动态效果,通 知,每周课堂提问记入平时成绩。第一阶段内容在第六周结束第7周安排一次测验:形式:笔试内容:第三章至第七章。有关概念、程序设计。本次布置的实验分两部分:必做和选做,建立程序“工程”的步骤(课本第二章),要求按照下列步骤规范执行启动VC+,点击File/New菜单Workspace:建立工作区。取工作区名称,文件夹选择在E盘(为了有效地保存文档,不要使用默认文件夹)Project:建立工程。取工程名称(注意选择在“当前工作区”)File:建立源程序文件。取文件名。输入源程序。编译、连接、运行。(了解程序文件存放的物理位置)使用MSD

2、N查找API函数的使用方法:Help/Search:“活动子集”选择“Platform SDK”;“要查找的单词”输入相关API函数名,在“选择主题”中查找并双击该函数名,即可得到关于函数的说明、使用示例。,关于在工程中添加文件、在工作区中添加工程,请查阅课本P49,重点注意:关于工作区面板“FileView”中树状组织与磁盘物理文件的关系关于工作区中工程与工程文件的编辑工具栏的设置,练习一 作图,对例4-1作如下修改,获得不同效果:改变图形填充色:三种图形使用不同颜色;改变图形外框线型;在圆角矩形中画两条对角线;(参考例4-3)在椭圆中画出长轴和短轴(轴长自定)试在用户区中加画一个三角形(自

3、己设计坐标,使用Polyline或Polygon)思考:把画笔画刷语句注释后,是否可画图?,练习二:窗口刷新消息处理与用户区颜色变化,在课本程序3-1中的窗口函数WndProc增加语句,对windows发送过来的窗口刷新消息WM_PAINT进行处理,并用不同颜色刷新用户区。认真阅读下列有关内容:窗口变化后的刷新请求与刷新过程:消息处理过程:(windows操作系统与窗口函数)画图步骤:(见后页)图形刷新的概念画图的基本方法,图形刷新的概念、画图的基本方法:,(1)刷新请求,(2)系统对刷新请求的响应 当用户区的内容需要刷新时,系统向应用程序消息队列发送WM_PAINT消息,系统在应用程序的消息

4、队列中加入该消息,以通知窗口函数执行刷新处理,三种刷新,窗口移动后的刷新被覆盖区域的刷新对象穿越后的刷新(系统自动完成),用户区移动或显示用户窗口大小改变程序通过滚动条滚动窗口,窗口被另一个窗口覆盖的恢复如下拉式菜单关闭等,光标穿过用户区图标拖过用户区,窗口被另一个窗口覆盖的区域称为无效区域。Windows系统为每个窗口建立了一个PAINTSTRUCT结构,该结构中包含了包围无效区域的一个最小矩形的结构RECT,应用程序可以根据这个无效矩形执行刷新操作。,Typedef struct tagPAINTSTRUCT HDC hdc;/设备描述表句柄 BOOL fErase;/一般取真值,表示擦除

5、无效矩形的背景 RECT rcPaint;/无效矩形标识 BOOL fRestore;/系统保留 BOOL fIncUpdate;/系统保留 BYTE rgbReserved16;/系统保留 PAINTSTRUCT;,常用的Windows应用程序刷新窗口的方法,保存副本。刷新时将副本拷贝到相应的窗口中,记录事件。刷新时重新执行这个曾经发生的事件,重新绘制。将图形绘制处理程序放在消息WM_PAINT响应模块中,刷新时重绘图形,(3)有效的刷新方法,消息处理过程,运行中的windows程序,窗口程序,窗口操作,窗口message+窗口标识,显示结果,画图步骤,准备画轮廓的画笔准备填充的画刷Wind

6、ows中每个对象都有“句柄”,画笔、画刷也是对象,也要通过“句柄”来使用定义画笔、画刷的句柄变量:HPEN hPen;HBRUSH hBrush;但hPen、hBrush还只是随机数,指定某种画笔、画刷给hPen,hBrush:hPen=CreatePen(PS_SOLID,2,RGB(red,green,blue);hBrush=CreateSolidBrush(RGB(red,0,0);,线型,线宽,线色,画刷颜色,画图的有关概念,谁负责画图?Windows直接画?Windows通过一套称为“设备无关”的图形接口程序(GDI函数)进行画图程序员的责任把有关要求:笔、刷、图形、参数提供给GD

7、I,设备描述表,记录各种作图要求与参数的数据结构Windows在任一时刻都能为每个窗口提供用于作图的“设备描述表”作图前一般都要先获取当前窗口的“设备描述表”通过函数把作图所需的设备(画笔、画刷、图形、参数)“写入”设备描述表,也就是提供给GDI调用GDI函数由GDI进行作图。,设备描述表的获取,设备描述表是一个对象,也要使用“句柄”HDChDC;/定义一个句柄为hDC赋值:hDC=GetDC(hwnd);/可用于各种消息处理时画图或hDC=BeginPaint(hwnd,/仅用于WM_PAINT这两种方法各有不同的适用场合,处理非WM_PAINT消息时绘图,处理WM_PAINT消息时绘图,画

8、图的程序写在哪里?,主要在对WMPAINT消息的处理中进行作图图形刷新画图程序设计的基本方法(思路)画笔、画刷的定义、选入图形参数的计算调用作图函数,调用GDI绘图函数画图,画一个圆画一个矩形画一个饼把整个用户区刷新:,);,RECT类型:定义了一个矩形区域及其左上角和右下角的坐标,匈牙利表示法,变量名以一个或多个小写字母开始,这些小写字母表示变量的数据类型。变量的后续字符描述变量的作用如:szCmdLine,hInstance,hPen变量名既描述了变量的作用,也描述了变量的数据类型避免产生数据类型不匹配及早发现错误,程序设计,在窗口函数WndProc中增加定义变量:HDC hdc;/设备描

9、述表句柄PAINTSTRUCT PtStr;/无效矩形变量HBRUSH hbrush;/画刷句柄 static int r=0,g=0,b=0;/三原色,程序设计,在处理WM_PAINT处写入下列程序,然后编译、连接、运行。case WM_PAINT:hdc=BeginPaint(hwnd,思考:窗口变化(放大、还原、移动、大小)有何不同?为什么?,改进效果:在窗口大小变化时也能对整个用户区进行刷新,增加对WM_SIZE消息的处理case WM_SIZE:InvalidateRect(hwnd,NULL,TRUE);return 0;InvalidateRect函数的作用:使用户区失效,让wi

10、ndows产生一条WM_PAINT消息:InvalidateRect(hwnd,NULL,FALSE/TRUE)NULL:刷新整个用户区;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消

11、息的处理,练习三:移动的图形,窗口函数开头的变量定义,增加:static int x=0;/思考:为什么定义static?case WM_PAINT:hdc=BeginPaint(hWnd,/思考:为什么设300为限?加大一些行吗?,练习四:在鼠标单击时图形变化,单击鼠标产生鼠标消息WM_LBUTTONDOWN,WM_RBUTTONDOWN。在这些消息到达窗口函数时,强制刷新用户区,重新画图。区分左右键画不同的图形:设两个标志变量static int lbutt=1,rbutt=0;在处理鼠标消息时更新这两个变量处理WM_PAINT消息时要分别根据lbutt和rbutt的状态选择画不同的图形。

12、,程序设计,窗口函数中增加变量定义static int lbutt=1,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进行各方面的“探索”,产生不同的动态效果:

13、改变正弦波的幅度小圆球的运动轨迹变成筒状小圆球上下运动小圆球能重复运动或往复运动按照实验报告要求完成任务,在网络课堂提交。,习题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)的值有正负,怎么办?,对“负值

14、坐标”的处理,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;,坐标计算放在消息循环之前,圆半径的变化:振幅的0.20.6倍线性增

15、长,在四分之一周期内变化:每个周期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的方法实现霓虹灯效果。按照实验报告要求完成任务,在网络课堂提交。,拓展设计:选作,主题设计:运用图形、文字,展现一个主题效果。例如:静静的小河池塘夜降七色雨春天的公园城市楼群其它主题完成时间:第十五周前提交:网络课堂“自选设计”作业1(作为课程设计综评加分)参考设计:网络课堂“设计范例”,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号