面向对象程序设计实验.ppt_第1页
面向对象程序设计实验.ppt_第2页
面向对象程序设计实验.ppt_第3页
面向对象程序设计实验.ppt_第4页
面向对象程序设计实验.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

试验三面向对象程序设计实验 一个简单的可复用时钟控件 本实验的开发环境 使用C 语言实现使用VC 6 0集成开发环境开发使用MFC应用程序开发框架 MFC版本简介 MFC全称MicrosoftFoundationClasses 1989年微软公司成立ApplicationFramework技术团队 开发C 面向对象工具给Windows应用程序开发人员使用 这个小组即AFX小组 就是他们 开始了MFC的开发历程 微软公司于1992年4月推出C C 7 0产品时 初次向世人介绍了MFC1 0 其32位版本也在1992年7月随着Win32SDK推出 VisualC 1 0 也就是C C 8 0 搭配MFC2 0于1993年3月推出 同年8月推出在WindowsNT上的VisualC 1 1forWindowsNT 搭配的是MFC2 1 微软在1993年12月又推出了16为的VisualC 1 5 搭配的是MFC2 5 1994年9月 微软推出VisualC 2 0 搭配MFC3 0 1995年1月 微软推在增加了MAPI和WinSock支持的基础上 推出MFC3 1 1995年7月 MFC有了3 2版 这是一个小的改版 然后就是1995年9月的32位版MFC4 0 这个版本有了相当大的改进 1996年上半年又有了MFC4 1 时至今日MFC在VisualC 7 0中已经到了7 0版本 我们常用的VisualC 6 0使用的是MFC4 2版本 微软正不断地为 为什么要使用MFC 加上各式各样地强烈你有 并强烈导引它成为Windows程序设计的C 标准界面 正如我们所看到的 越来越多的MFC程序出现了并继续在产生 试验设计目标 完成一个可重用的C 类 可以通过该类实现一个简单的模拟时钟编写一个简单的MFC程序测试验证这个时钟控件类关于这个时钟控件 如果按照课件继续完善下去 请将他做得更好更强大 比如说 可以考虑为时钟控件的各项设置 如颜色 提供外部接口 供CClockEx的使用者调用 可以考虑丰富背景绘制 加入背景图片设置 在刻度上标上数字 为指针加上阴影效果 在时钟上显示日期等 有兴趣的同学有空不妨试试 应用程序框架设计过程 仅供参考 打开VC 6 0 新建一个MFC工程 输入工程名 选择 MFCAppWizard 如图所示 然后点击OK 为简单起见 这里选择 Dialogbased 程序 然后可以直接选择finish了 在类视图的工程名上右键单击 选择NewClass 如下图所示 来建立一个新类 我们可以从CStatic类 静态控件类 派生出类CClockEx来实现时钟控件类 这样 就可以继承MFC静态控件的很多已经具备的功能和特点 在建立新类的对话框中 按下图输入 按Ctrl W调出ClassWizard 在classname中选择刚才建立的新类CClockEx 然后重载虚函数PreSubClassWindow 对时钟控件的基本初始化工作将在该函数中进行 添加消息响应WM PAINT 我们必须用自己完成时钟的绘制工作 添加消息响应WM SIZE 重载该消息响应以便我们的时钟控件能够自动适应其大小的变化 为了时钟能够走动 我们得定时刷新时钟控件让它走动 还得添加WM TIMER的消息响应 最终效果如下图所示 到目前为止 时钟控件的轮廓和已经有了 下面考虑时钟绘制的具体实现 一个时钟大致可由时钟背景 时针 分针 秒针四个部分构成 以上的时钟四个部分可是看作四个不同的对象 可以考虑建立类CClockBackground CClockHourHand CClockMinHand CClockSecHand来分别实现 此处为了意义明确 类名都比较长 这四个类有它们的共同点 譬如都有自己的绘图函数 如果要具体能够设置颜色 它们都应该有自己的绘图颜色 同样应该有颜色设置函数 此外都有绘图区域和区域设置函数等等 因此 可以为它们的共性建立一个基类 此处命名为CClockElement 下面逐步实现各个类 首先实现各个组成类的基类 CClockElement 同样 在ClassView的工程名上面点右键 选择NewClass 在ClassType里面选择GenenricClass 类CClockElement不需要从其它类派生 所以BaseClass可以不填 效果如下图所示 下面对类CClockElement的源代码进行编写 因为在后面的绘图中需要用到sin和cos这两个数学计算公式 因此需包含头文件以便使用数学函数库 为后面计算使用 还需定义数学常量PI 3 1415926535 时钟的每个组成部分都有绘图区域区域 因此 可在基类中定义绘图区域变量 同理 可以定义颜色变量 为了是颜色不显得单调 这里为每个控件设置两种颜色 如果想使程序更加绚丽 可以设置更多颜色 对应的 这些变量需增加接口函数来进行访问 对于每个组成部分都应该有的Draw函数 当然也需在基类中定义 但是 该函数对于基类来说是无需函数实现的 因此可定义为纯虚函数 综合刚才这几点 CClockElement的实现的头文件代码如下 include definePI3 1415926535classCClockElement public voidSetColor COLORREFcrMain COLORREFcrOther 设置颜色voidSetTime constCTime 时钟半径 CClockElement的实现的源文件关键代码如下 CClockElement CClockElement m nRadius 0 m crMain RGB 255 255 255 m crOther RGB 128 128 128 CClockElement CClockElement voidCClockElement SetRegion LPRECTlprcRect m rcRegion lprcRect m nRadius m rcRegion Width 2 if m rcRegion Width m rcRegion Height m nRadius m rcRegion Height 2 续上页 voidCClockElement SetTime constCTime 下面实现时钟背景类 CClockBackground 同样 在ClassView的工程名上面点右键 选择NewClass 在ClassType里面选择GenenricClass 类CClockBackground需要从类CClockElement派生 所以BaseClass需选择类CClockElement 效果如下图所示 CClockBackground只需实现基类的虚函数Draw即可 因此这里重载基类的虚函数Draw 其头文件实现代码如下 include ClockElement h classCClockBackground publicCClockElement public CClockBackground virtual CClockBackground CClockBackground源文件代码如下 CClockBackground CClockBackground 为时钟背景定义默认的颜色设置m crMain RGB 0 255 0 m crOther RGB 0 128 0 CClockBackground CClockBackground voidCClockBackground Draw CDC pDC 准备设备环境CPenpenMain PS SOLID 1 m crMain penOther PS SOLID 1 m crOther CBrushbrMain m crMain brOther m crOther CPen pOldPen pDC SelectObject CClockBackground源文件代码如下 续上页 绘制60个小圆点 表示分针和秒针的刻度CPointptCenter m rcRegion CenterPoint intnRadius m nRadius 8 for inti 0 iEllipse rcDot 绘制12个小方框 表示12个正点pDC SelectObject 下面实现时针类CClockHourHand 该类新建的过程与CClockBackground一样 CClockHourHand同样只需实现基类的虚函数Draw即可 其头文件实现代码如下 include ClockElement h classCClockHourHand publicCClockElement public CClockHourHand virtual CClockHourHand virtualvoidDraw CDC pDC CClockHourHand源文件代码如下 CClockHourHand CClockHourHand 定义默认颜色m crMain RGB 0 255 100 m crOther RGB 128 128 0 CClockHourHand CClockHourHand voidCClockHourHand Draw CDC pDC 初始化设备环境CPenpenMain PS SOLID 1 m crMain penOther PS SOLID 1 m crOther CBrushbrMain m crMain brOther m crOther CPen pOldPen pDC SelectObject CClockHourHand源文件代码如下 续上页 确定绘制菱形指针所需的四个角的坐标CPointptDiamond 4 for inti 0 i 4 i ptDiamond i m rcRegion CenterPoint intnRadus m nRadius 2 ptDiamond 0 Offset int nRadus sin fRadian int nRadus cos fRadian fRadian 0 5 PI nRadus m nRadius 20 ptDiamond 1 Offset int nRadus sin fRadian int nRadus cos fRadian fRadian 0 5 PI nRadus m nRadius 10 ptDiamond 2 Offset int nRadus sin fRadian int nRadus cos fRadian fRadian 0 5 PI nRadus m nRadius 20 ptDiamond 3 Offset int nRadus sin fRadian int nRadus cos fRadian CClockHourHand源文件代码如下 续上页 绘制菱形时针pDC Polygon ptDiamond 4 恢复设备环境pDC SelectObject pOldPen pDC SelectObject pOldBrush 下面实现分针类CClockMinHand 该类新建的过程与CClockHourHand一样 类的实现也基本相似 其头文件实现代码如下 include ClockElement h classCClockMinHand publicCClockElement public CClockMinHand virtual CClockMinHand virtualvoidDraw CDC pDC CClockMinHand源文件代码如下 CClockMinHand CClockMinHand 定义默认颜色m crMain RGB 0 255 100 m crOther RGB 128 128 0 CClockMinHand CClockMinHand voidCClockMinHand Draw CDC pDC 初始化设备环境CPenpenMain PS SOLID 1 m crMain penOther PS SOLID 1 m crOther CBrushbrMain m crMain brOther m crOther CPen pOldPen pDC SelectObject CClockMinHand源文件代码如下 续上页 确定绘制菱形指针所需的四个角的坐标CPointptDiamond 4 for inti 0 i 4 i ptDiamond i m rcRegion CenterPoint intnRadus m nRadius 2 ptDiamond 0 Offset int nRadus sin fRadian int nRadus cos fRadian fRadian 0 5 PI nRadus m nRadius 20 ptDiamond 1 Offset int nRadus sin fRadian int nRadus cos fRadian fRadian 0 5 PI nRadus m nRadius 10 ptDiamond 2 Offset int nRadus sin fRadian int nRadus cos fRadian fRadian 0 5 PI nRadus m nRadius 20 ptDiamond 3 Offset int nRadus sin fRadian int nRadus cos fRadian CClockMinHand源文件代码如下 续上页 绘制菱形分针pDC Polygon ptDiamond 4 恢复设备环境pDC SelectObject pOldPen pDC SelectObject pOldBrush 下面实现秒针类CClockSecHand 该类新建的过程与CClockHourHand一样 类的实现也基本相似 其头文件实现代码如下 include ClockElement h classCClockSecHand publicCClockElement public CClockSecHand virtual CClockSecHand virtualvoidDraw CDC pDC CClockSecHand源文件代码如下 CClockSecHand CClockSecHand 设定秒针的默认颜色m crMain RGB 0 200 200 m crOther RGB 0 200 200 CClockSecHand CClockSecHand voidCClockSecHand Draw CDC pDC intnTime m tmCur GetSecond CPointptStart m rcRegion CenterPoint CPointptEnd ptStart intnRadius m nRadius 10 ptEnd Offset int nRadius sin 2 PI nTime 60 int nRadius cos 2 PI nTime 60 CPenpenMain PS SOLID 1 m crMain CPen pOldPen pDC SelectObject 到目前为止 时钟的各个部件都已经设计完毕 现在该把它们组装起来了 刚才建立的四个类CClockBackground CClockHourHand CClockMinHand CClockSecHand要为CClockEx服务 正如CClockElement为它们服务一样 不过服务的方式发生了变化 刚才是以继承的方式使用 现在需要将上面四个类实例化供CClockEx使用 因此 首先应该在类CClockEx为上四个类分别建立对象 在CClockEx的头文件中恰当位置加入以下代码 include ClockBackground h include ClockHourHand h include ClockMinHand h include ClockSecHand h classCClockEx publicCStatic private CClockBackgroundm clockBK 时钟背景CClockHourHandm clockHour 时指针CClockMinHandm clockMin 分指针CClockSecHandm clockSec 秒指针 为了存储绘图区域的大小 需要在CClockEx中加入一个变量m rcClient CRectm rcClient 客户区域在PreSubclassWindow函数中进行时钟的初始化工作 首先得为各个部件设定区域大小 然后启动定时刷新的定时器 100毫秒的定时器已经足够 由于每个部件都有自己的默认颜色配置 因此这里暂且先使用默认配置 当然也可以自定义颜色 GetClientRect m rcClient 获取当前客户区域m clockBK SetRegion m rcClient m clockHour SetRegion m rcClient m clockMin SetRegion m rcClient m clockSec SetRegion m rcClient SetTimer 1 100 NULL 每100毫秒刷新一次 当控件大小发生变化时 控件状态要能够自动更新 voidCClockEx OnSize UINTnType intcx intcy CStatic OnSize nType cx cy GetClientRect m rcClient m clockBK SetRegion m rcClient m clockHour SetRegion m rcClient m clockMin SetRegion m rcClient m clockSec SetRegion m rcClient 每个定时器时间触发时 需要刷新控件以保证时钟的走动 voidCClockEx OnTimer UINTnIDEvent Invalidate FALSE CStatic OnTimer nIDEvent 下面实现时钟的绘制 由于控件在不断刷新 按一般方式绘图 屏幕会不断闪烁 因此此处使用双缓冲绘图 就是在内存中绘图 绘制完毕时在Copy到屏幕上 这样可以有效的防止屏幕闪烁 voidCClockEx OnPaint CPaintDCdc this devicecontextforpainting 实现双缓冲绘图 防止屏幕闪烁CDCdcMem dcMem CreateCompatibleDC 为了程序结构更清晰 我们将绘图函数放在一个单独的函数DrawClock中 下面室DrawClock的函数实现 voidCClockEx DrawClock CDC pDC CTimetmCur CTime GetCurrentTime m clockBK SetTime tmCur m clockHour SetTime tmCur m clockMin SetTime tmCur m clockSec SetTime tmCur m clockBK Draw pDC m clockMin Draw pDC m clockHour Draw pDC m clockSec Draw pDC 下面是完整的CClockEx源码 if defined AFX CLOCKEX H EB35C434 A727 43BE B10E 121F6307EA73 INCLUDED defineAFX CLOCKEX H EB35C434 A727 43BE B10E 121F6307EA73 INCLUDED if MSC VER 1000 pragmaonce endif MSC VER 1000 ClockEx h headerfile CClockExwindow include ClockBackground h include ClockHourHand h include ClockMinHand h include ClockSecHand h classCClockEx publicCStatic private CRectm rcClient 客户区域CClockBackgroundm clockBK 时钟背景CClockHourHandm clockHour 时指针CClockMinHandm clockMin 分指针CClockSecHandm clockSec 秒指针voidDrawClock CDC pDC Constructionpublic CClockEx 下面是完整的CClockEx源码 续上页 Attributespublic Operationspublic Overrides ClassWizardgeneratedvirtualfunctionoverrides AFX VIRTUAL CClockEx protected virtualvoidPreSubclassWindow AFX VIRTUAL Implementationpublic virtual CClockEx Generatedmessagemapfunctionsprotected AFX MSG CClockEx afx msgvoidOnPaint afx msgvoidOnSize UINTnType intcx intcy afx msgvoidOnTimer UINTnIDEvent AFX MSGDECLARE MESSAGE MAP AFX INSERT LOCATION MicrosoftVisualC willinsertadditionaldeclarationsimmediatelybeforethepreviousline endif defined AFX CLOCKEX H EB35C434 A727 43BE B10E 121F6307EA73 INCLUDED 下面是完整的CClockEx源码 续上页 ClockEx cpp implementationfile include stdafx h include ClockProject h include ClockEx h ifdef DEBUG definenewDEBUG NEW undefTHIS FILEstaticcharTHIS FILE FILE endif CClockExCClockEx CClockEx CClockEx CClockEx BEGIN MESSAGE MAP CClockEx CStatic AFX MSG MAP CClockEx ON WM SIZE ON WM PAINT ON WM TIMER AFX MSG MAPEND MESSAGE MAP 下面是完整的CClockEx源码 续上页 CClockExmessagehandlersvoidCClockEx PreSubclassWindow 获取当前客户区域GetClientRect m rcClient m clockBK SetRegion m rcClient m clockHour SetRegion m rcClie

温馨提示

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

评论

0/150

提交评论