《指针式时钟课程设计报告》由会员分享,可在线阅读,更多相关《指针式时钟课程设计报告(18页珍藏版)》请在金锄头文库上搜索。
1、青岛理工大学C+面向对象课程设计报告院(系): 计算机工程学院 专业: 网络工程 学生姓名: 赵建 班级: 网络 081 学号: 200807111 题目: 指针式时钟 起讫日期: 2011.7.52011.7.14 设计地点: 学院机房 101 指导老师: 吴 万 春 完成日期:2011 年 7 月 14 日1一、 课程设计目的时钟几乎是每个人生活中必备的生活用品。时钟虽小确非常重要。一款良好的时钟可以给人们带来极大的便利。当然,现在关于时钟的各种应用程序层出不求,我的目的是设计一款界面简单、方便易用、功能相对丰富的指针式时钟程序。为了达到上述目标,以及课程设计的要求,结合自己自身的情况,选
2、择了 PC 平台、Windows 操作系统、Visual C+ 6.0 开发平台、MFC 框架来实现自己的程序。而且希望能通过自己这款小应用程序的设计,来掌握面向对象的程序设计方法,了解 C+面向对象的设计方法和技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。二、 课程设计内容及要求程序所实现的功能:运行界面是一指针式时钟,包括时分秒三个指针,有 12 个钟点的显示,并通过指针的转动来实时更新时间。同时可以显示相应时间的数字钟形式。通过菜单可以实现闹铃功能、表盘背景、指针颜色设置、倒计时等功能。同
3、时为程序窗口增加了一张精美图片作为背景三、 系统分析与设计1、 系统分析为了使程序的显示更加美观,该程序使用了 C+可视化程序设计方法进行设计。在可视化程序设计中,建立了一个 MFC 单文档应用程序工程,该工程包括了视图类、文档类对话框类和主框架类。在主框架类中修改窗口等属性,使整个时间的显示更加协调。模拟电子时钟是一个显示和计时的小程序,因此只要在视图类和文档类添加相关的属性和方法即可完成模拟电子时钟的功能。文档类定义时钟的相关属性,包括 int 类型的year、month、day 、hour 、minute、second,和包括 CString 类型的str_year、str_month、
4、str_day、str_hour、str_minute、str_second 等信息。int 类型的时间日期属性用以计算,CSrting 类型的时间日期属性用以显示,通过 CString 类中的成员函数Formart 可以把 int 型的数据转成 CString 型的。视图类实现时钟的主要功能,在该类的 OnDraw 函数里面对时间日期进行显示输出。向窗口输出信息时,为了保证高刷新率下绘图不闪烁,使用内存绘图的方法,在内存中创建一个与屏幕绘图区域一致的对象,使得重绘视图时可以大大提高运行速度。为了使计时能够达到几乎无误差,使用了一个获取系统两秒间隔作为计时间隔的方法,使得计时间隔和系统时间间隔
5、一致。每次重绘视图的时候都重新获取系统时间,当该两次获得的秒不一致时,就对时间加一秒。通过一个计时器消息,使视图 50ms 刷新一次,以保证时间的准确性。在视图类中需要添加几个方法:用于计算时间的方法 RunTime()、计算星期的方法Week()、int 型转 CString 型的方法 Change()、获取系统时间的方法 GetDateTime()、重获系统时间方法 OnReset()和计时器消息。在计算时间日期的时候,每达到 1 秒的时候对 second 进行加 1,然后判断是否达到 60秒,达到的话 minute 就加 1,同样的方法对 hour、day、 month 和 year 进
6、行计算,在对day 计数时,考虑到大小月和闰年,对 day 进行加 1 时,判断是哪一月和是否为闰年。在2确定年、月、日之后,使用函数 Week()进行对星期几的计算,根据 1901 年每月 1 号是星期几可以得出现在是星期几。在这个程序中,还使用了一个对话框类,使用对话框来对时间日期的设置。在菜单栏里添加一个“设置时间”的选项和一个菜单消息,当点击这个选项就会弹出设置时间日期的对话框,对话框中编辑控件设定了每个值的取值范围,从而对输入错误进行排除。2、 系统设计2.1 模块设计+ C D a t e T i m e D o c ( )+ y e a r+ m o n t h+ d a y+
7、h o u r+ m i n u t e+ s e c o n d+ s t rC D a t e T i m e D o c+ C D a t e T i m e V i e w ( )+ O n D r a w ( )+ W e e k ( )+ R u n T i m e ( )+ C h a n g e ( )+ G e t D a t e T i m e ( )- f l a g- _ s e c 1- _ s e c 2C D a t e T i m e V i e w+ O n I n i t D i a l o g ( )+ O n O K ( )- y e a r- d a
8、y- h o u r- m i n u t e- m o n t h- s e c o n dC S e t t i n g依赖主要类图时钟程序时间查看功能时钟工作状态设置功能个性化颜色设置功能开始工作暂停工作倒计时功能表盘颜色设置功能时针颜色设置分钟颜色设置闹铃功能秒针颜色设置各模块关系图3画出主程序及其主要模块的流程图:绘制时钟指针制作数字时钟绘制表盘刻度开始和系统时间同步用图片来填充背景窗口关闭时钟功能选择42.2 算法流程图在内存中创建一个与屏幕绘图区域一致的对象在内存中创建一个与屏幕绘图区域一致的对象是否需要加 1 秒是否需要加 1 秒调用加 1 秒函数 R u n T i m e
9、( )调用加 1 秒函数 R u n T i m e ( )内存中绘出日期时间和星期内存中绘出日期时间和星期将内存中绘制的图像复制到当前设备将内存中绘制的图像复制到当前设备NY延时 5 0 m s延时 5 0 m sOnDraw 函数流程图四、 系统测试与调试分析1、系统测试测试名称 指针式时钟测试目的 验证软件的时间功能测试技术 单元测试测试说明 测试方法 黑盒测试法测试内容 显示时间和系统时间对比测试步骤 运行程序测试数据测试用例 预期结果 显示时间和系统时间一致结束5测试结果 与预期相符测试名称 指针式时钟测试目的 验证闹钟功能测试技术 单元测试测试说明 测试方法 黑盒测试法测试内容 闹
10、钟功能 时间测试步骤 正确输入闹钟时间 正确输入闹钟时间测试数据 当前时间 下一分钟的时间预期结果 立即报时 时间到后闹钟报时测试用例测试结果 与预期相符 与预期相符测试名称 指针式时钟测试目的 验证倒计时功能测试技术 单元测试测试说明 测试方法 黑盒测试法测试内容 倒计时功能测试步骤 正确时间测试数据 随意输入时间 预期结果 从输入的时间开始倒计时测试用例测试结果 与预期相符测试名称 指针式时钟测试目的 验证改换颜色测试技术 单元测试测试说明 测试方法 黑盒测试法测试内容 换指针颜色功能测试步骤 选择换表盘颜色 选择换指针颜色测试数据 红色 时针蓝色 分针黑色 秒针绿色预期结果 表盘颜色变为
11、红 时针蓝色 分针黑色 秒针绿色测试用例测试结果 与预期相符 与预期相符2 调试分析程序的调试过程会发现很多设计程序过程中的漏洞,也会有很多 bug 出现,需要仔细的不断调试才能尽量的把程序调试的完美,我的程序调试的过程中出现的问题较多,现列举几个比较有代表性的,希望供其他人参考1、 我最初想到的是设计出一个不依靠读取系统时间就能独立运行的时钟,但是,个人能力实在有限,设计了一段时间还是没有头绪,只能投机取巧的读取系统时间代替了,这样的话一些个性话的功能就不能够实现了,像把一分钟设置成 120 秒,每小时 30 分钟等2、 目前的程序虽然能正常运行,但是,对于一些错误是不能反映出来的,像输入闹
12、钟时间,如果输入的范围不对的话也不能给出提示3、 闹钟的时间输入因为没有秒的限制,如果是当前时间的话,目前的程序会直接报时,6应该可以改成当前时间不报时的五、用户手册1、windows 系统 vc+6.0 设计2、本程序不需要安装使用,直接运行即可弹出时钟对话框3、图 1 时钟主界面 图 2 程序功能界面进入程序后会弹出图 1 界面显示系统时间,点击设置按钮可以出现图 2 功能列表图 3 闹钟时间设置界面 7图 4 倒计时时间设置界面打开功能列表可以选择各个功能,图 3 为选择闹钟功能弹出的对话框,图 4 为选择倒计时功能弹出的对话框图 5 表盘及指针颜色设置界面选择设置表盘或者各指针颜色时都
13、会弹出图 5,选择喜欢的颜色点击确定后即可改变颜色六、程序清单(1): /视图类的构造函数CShejiView:CShejiView()/ TODO: add construction code hereCBitmap bmp;/定义一个位图类型的变量。bmp.LoadBitmap(IDB_BITMAP1); /加载位图m_brushBackground.CreatePatternBrush( /创建位图画刷。CTime curtime = CTime:GetCurrentTime();/同步系统时间。m_hour = curtime.GetHour();m_minute = curtime.
14、GetMinute();m_second = curtime.GetSecond();flag=0;/时钟正常工作状态flag2=1;/倒计时无效;hour=-1;minute=-1;set=0;8(2)/ondraw()函数进行绘制void CShejiView:OnDraw(CDC* pDC)CShejiDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect rect;GetClientRect(rect);/取得客户区域pDC-FillRect(rect, /
15、用背景画刷填充区域,而我们在mbrushbackground 里加载了位图,所以理所当然就变成了我们设置的图片/画表盘,标注刻度CRect client;GetClientRect(int centerX = client.Width()/2;int centerY = client.Height()/2;int clockRadius = centerX centerY ? centerY : centerX;/用较小的一个作为钟表的半径,避免半径太大矩形放不开clockRadius = clockRadius * 0.9;int keduDRadius = clockRadius * 0.85;int keduXRadius = clockRadius * 0.95;int hourRadius = clockRadius * 0.3;/时针半径int minuteRadius = clockRadius * 0.5;/分针半径int secondRadius = clockRadius * 0.7;/秒针半径/CPen clockPen(PS_SOLID, 2, RGB(0,0,255);CPen clockPen(PS_SOLID, 2, bpcolor);/配合下面的执行代码,使用自己定义的画笔来设置表盘的颜色CPen * oldPen = pDC-S