c++课程设计实验报告.docx
《c++课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《c++课程设计实验报告.docx(6页珍藏版)》请在冰豆网上搜索。
c++课程设计实验报告
c++课程设计实验报告
中南大学
本科生课程设计(实践)任务书、设计报告
(C++程序设计)
题目
时钟控件
学生姓名
指导教师
学院
交通运输工程学院
专业班级
学生学号
计算机基础教学实验中心
2012年9月7日
《C++程序设计基础》课程设计任务书
对象:
粉冶、信息、能源、交通工程实验2101学生时间:
2012.62周(18~19周)
指导教师:
王小玲
1.课程设计的任务、性质与目的
本课程设计是在学完《C++程序设计基础》课程后,进行的一项综合程序设计。
在设计当中学生综合“面向对象程序设计与结构化程序设计”的思想方法和知识点,编制一个小型的应用程序系统。
通过此设计进一步提高学生的动手能力。
并能使学生清楚的知道开发一个管理应用程序的思想、方法和流程。
2.课程设计的配套教材及参考书
●《C++程序设计》,铁道出版社,主编杨长兴刘卫国。
●《C++程序设计实践教程》,铁道出版社,主编刘卫国杨长兴。
●《VisualC++课程设计案例精编》,中国水力电力出版社,严华峰等编著。
3.课程设计的内容及要求
(1)自己任选一个题目进行开发(如画笔、游戏程序、练习打字软件等),要求利用MFC工具操作实现。
(2)也可选一个应用程序管理系统课题
(3)
(4)系统功能及系统设计介绍
●系统开发的体会
论文基本格式要求:
●封面,见附件1
●正文,见附件2
考核方式与评分办法
●出勤考核成绩占总成绩20%。
●设计成果评价总总成绩的60%。
●实践论文评价占总成绩的20%。
2012年6月6日
时钟控件
摘要:
使用vc++6.0编写一个模拟时钟程序,此程序在屏幕左方有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。
用菜单选项或按钮设置时间和秒表。
时间不必与机器系统时间相同,可任意设置。
关键词:
c++程序设计、mfc[.exe]、面向对象、时钟、秒表
一、时钟程序开发设计思想
该程序设计主要涉及到的知识点有:
时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字、修改程序图标等。
其中最关键的是指针运动算法和屏幕重绘方法的应用。
其中,在设计表盘指针的时候,由于不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x,y)的公式如下:
x=圆心x坐标+指针长度*cos(指针方向角)
y=圆心y坐标+指针长度*sin(指针方向角)
而指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
另一方面,三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此需要使用一个定时器消息来处理指针的运动。
若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。
采用一个定时器消息可以很容易实现指针联动算法。
代码的编写当中可以使用我们所学过的if语句来实现指针的联动。
由于屏幕的重绘速度很快(50ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针;如果指针没有动,则直接绘制指针。
另外,秒表采用的是单独的定时器消息控制。
二、时钟功能及程序设计介绍
1、系统功能介绍
(1)左边部分是一个圆形表盘,右边部分上面是一个数字式时钟,右边下面是一个秒表。
(2)圆形表盘时针、分针而后秒针运动规律正确且即使重合在一起也能清楚的进行辨认;数字式时钟可以显示年、月、日、时、分、秒等数据。
时间显示与指针式时钟显示一致;秒表显示窗中显示从0开始的时间,单位为百分之一秒。
再次按下秒表控制按钮后计时停止,该窗口显示累计时间。
(3)按下设置时间菜单项可弹出一对话框,用于设置当前的时间和日期。
(4)具有一个美观大方的图标和个性的帮助信息。
2、程序设计介绍
(1)首先在mfcAppWizard中生成一个名为Clock的单文档程序框架。
然后在classview中修改cclockapp中lnitlnstance[]中的代码,去掉单文档窗口中上面和下面部分的工具栏,使得界面更加美观。
然后修改resourceview中dialog和version下面的信息,添加、修改程序的图标与定制个性化的帮助信息。
(2)编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。
在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。
并在菜单属性项中设定“启动时钟”菜单的ID标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“时间设置”菜单的ID标号为ID_SETTIME。
(3)利用ClassWizard为视图类添加菜单命令处理函数。
进入ClassWizard的MessageMaps选项卡,选择ClassName项为CClockView类,在ObjectIDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下AddFunction按钮添加成员函数。
ClassWizard会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart()、OnStop()和OnSettime()。
(4)利用ClassWizard为视图类添加定时器和鼠标消息处理函数。
进入ClassWizard的MessageMaps选项卡,选择ClassName项为CClockView类,在Messages列表框中分别选择定时器消息WM_TIMER和鼠标消息WM_LBUTIONDOWN,按下AddFunction按钮添加成员函数。
ClassWizard会添加相应的定时器和鼠标消息响应函数OnTimer和OnLButtonDown。
(5)使用DeveloperStudio菜单的Insert/Resource…选项调出InsertSource对话框,为项目添加新的对话框资源。
在对话框属性中,修改对话框名为“时间设定”。
在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件。
并通过控件属性,将年、月、日、时、分、秒等编辑控件的ID改为IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE和IDC_SECOND。
(6)设计好这个对话框模板后,利用ClassWizard自动建立对话框类。
进入ClassWizard后,它会发现已建立的对话框模板资源,并弹出一个对话框询问是否要为该对话框模板建立类。
按下“OK”按钮,会弹出NewClass对话框,在Name栏填写对话框类的名称CSetTimeDlg后按“OK”按钮,即可为对话框创建一个对应的类。
(7)利用ClassWizard为对话框类添加与各控件对应的数据成员。
选择MemberVariables选项卡,确保ClassName项为对话框CSetTimeDlg类,然后在选项卡下方的窗口中选择各控件的ID并按下“AddVariable…”按钮,为其添加对应成员变量,如下表所示。
编辑控件属性
ControlIDs
VariableType
Membervariablename
VariableRange
IDC_YEAR
int
m_Year
0~3000
IDC_MONTH
int
m_Mouth
1~12
IDC_DAY
imt
m_Day
1~31
IDC_HOUR
imt
m_Hour
0~23
IDC_MINUTE
int
m_Minute
0~59
IDC_SECOND
int
m_Second
0~59
最后一列为变量取值范围。
(8)完成以上工作后,即可修改程序框架,在关键部分添加必要的代码来实现表盘的绘制、计时器的设置、指针的计算和屏幕的重绘等要求。
(9)组建、运行、调试。
最终效果图
3、程序设计过程中遇到的问题以及解决方法
(1)漏打字母。
比如在前面clockView中添加的引用头文件的语句中csettimedlg打成了csetimedlg,而头文件是#include“SetTimeDlg.H”,导致在组建调试的时候总是提示引用不到头文件、没有这个文件,后来是一行行仔细检查代码的时候发现的。
(2)错打符号。
在clockview.cpp中添加代码的时候,有个//{{AFX_DATA_INIT(CSetTimeDlg)……//}}AFX_DATA_INIT当中的{{和}}打成了||,结果导致后面设定初始时间的代码无法找到对应的头文件。
这是我通过对比其他没有修改过的原来就存在的函数的格式发现并改正的。
这件事也让我纠正了原来一直有的一个误区,//符号后面的不一定只有对代码无任何影响的注释。
(3)窗口大小设置的问题。
我通过movewindow函数来设置窗口大小,但是总是没有成功,后来考虑到窗口大小对程序的正常使用没有多大影响,而且设置了窗口大小的话,就不好确定表盘右边秒表方框的位置了,所以这件事就不了了之了,这也是本次程序设计过程当中的一大遗憾。
(4)屏幕的重绘问题。
存在两个问题,第一个是本程序由于完全在OnDraw函数中实现,因此屏幕重绘较为麻烦。
如果在OnDarw函数中采用“异或”屏幕重绘方式,在程序窗口最大、最小化及移出屏幕时,会显示异常。
通过查阅资料得知,解决这一问题较理想的方式是在定时器处理函数OnTimer中采用“异或”方式直接重绘屏幕,而不采用调用Invalidate()函数的方式;同时在OnDraw函数中显示指针的最后状态,以便处理程序窗口最大、最小化及移出屏幕的情况。
第二个是采用全屏删除式重绘则屏幕闪烁明显,显示效果不佳。
可以通过采用非删除式重绘的方式来缓解这一现象。
三、时钟开发的体会
这是我第一次使用mfc开发小程序,由于只是对vc++和mfc相关的知识的掌握程度不是很高,所以我在图书馆和网络当中查找了很多相关的资料,但是甚至照着书本制作的过程当中还是出现了很多问题,使得我调试了很长时间,才发现这是一件很费精力的事情,这件事使得我觉得程序开发是很不容易的,尤其是大型的程序。
另外,这次计算机课程设计不仅让我巩固了以前所学的编程方面的知识、学到了很多课堂上所学不到知识,而且让我明白了一个道理,“千里之堤毁于蚁穴”,无论是编程的时候,还是平时生活学习、进行科学研究的时候,都要养成严谨、仔细的作风,否则就算再努力,最后得到的可能还是零。
最后,我要对所有在我完成课程设计的过程当中提供过帮助的老师和同学表示衷心的感谢,尤其要感谢裘老师、李老师,是你们对我耐心的讲解和帮助,才让我顺利的完成了本次课程设计;是你们,给我提供了这样一个补充自我、提升自我的机会和平台,谢谢你们!