简单图形绘制与动态效果_第1页
简单图形绘制与动态效果_第2页
简单图形绘制与动态效果_第3页
简单图形绘制与动态效果_第4页
简单图形绘制与动态效果_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 tagPAINTSTRUCT

5、 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) );,线型,线宽,线色,画刷颜色,画图的有关概念,谁负责画图? Windows直接画? Wi

7、ndows通过一套称为“设备无关”的图形接口程序(GDI函数)进行画图 程序员的责任 把有关要求:笔、刷、图形、参数提供给GDI,设备描述表,记录各种作图要求与参数的数据结构 Windows在任一时刻都能为每个窗口提供用于作图的“设备描述表” 作图前一般都要先获取当前窗口的“设备描述表” 通过函数把作图所需的设备(画笔、画刷、图形、参数)“写入”设备描述表,也就是提供给GDI 调用GDI函数由GDI进行作图。,设备描述表的获取,设备描述表是一个对象,也要使用“句柄” HDChDC; /定义一个句柄 为hDC赋值: hDC=GetDC(hwnd);/可用于各种消息处理时画图 或 hDC=Begi

8、nPaint(hwnd,/仅用于WM_PAINT 这两种方法各有不同的适用场合,处理非WM_PAINT消息时绘图,处理WM_PAINT消息时绘图,画图的程序写在哪里?,主要在对WMPAINT消息的处理中进行作图 图形刷新 画图程序设计的基本方法(思路) 画笔、画刷的定义、选入 图形参数的计算 调用作图函数,调用GDI绘图函数画图,画一个圆 画一个矩形 画一个饼 把整个用户区刷新:Rectangle(hdc,PtStr.rcPaint.left, PtStr.rcPaint.top, PtStr.rcPaint.right, PtStr.rcPaint.bottom);,RECT类型:定义了一个

9、矩形区域及其左上角和右下角的坐标,匈牙利表示法,变量名以一个或多个小写字母开始,这些小写字母表示变量的数据类型。 变量的后续字符描述变量的作用 如:szCmdLine,hInstance,hPen 变量名既描述了变量的作用,也描述了变量的数据类型 避免产生数据类型不匹配 及早发现错误,程序设计,在窗口函数WndProc中增加定义变量: HDC hdc; /设备描述表句柄 PAINTSTRUCT PtStr; /无效矩形变量 HBRUSH hbrush; /画刷句柄 static int r=0,g=0,b=0; /三原色,程序设计,在处理WM_PAINT处写入下列程序,然后编译、连接、运行。

10、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:刷新整个用户区;TRUE:清除用户区当前图像;,练习三 :移动的图形,以课本程序4-1

11、为基础,增加刷新与程序暂停函数,使图形动起来。 图形能动的原因: 刷新后在另一个位置画图 增加一个图形位移变量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; /思考:为什么定义static? case WM_PAINT: hdc=BeginPai

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

13、;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)的值有正负,怎么办?,对“负值坐标”的处理,Y轴方向加一个振幅 POINT lpSin100;/存储正弦曲线点的坐标. for(in

15、t 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倍线性增长,在四分之一周期内变化:每个周期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为基础,产生霓虹灯效

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论