C++指针型闹钟课程设计

更新时间:2024-04-26 03:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课 程 设 计 说 明 书

题 目: 指针型闹钟 学院名称: 专业班级: 姓名学号: 指导教师:

2013 年 07 月

课程设计任务书

专业班级: 学生姓名: 指导教师:

一、课程设计题目:设计一个如图所示的指针式闹钟

二、目的与要求: 1、目的:

(1)要求学生熟练掌握C++语言的基本知识和C++调试技能; (2)掌握用C++开发应用程序的一般步骤和方法;

(3)能够利用所学的基本知识和技能,解决简单的面向对象的程序设计问题。 (4)培养学生综合利用C++语言进行程序设计的能力,主要是培养学生利用系统提供的标准图形函数进行创新设计。 2、基本要求:

(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计; (2)要求在设计的过程中,对Windows环境下的编程有一个基本的认识; (3)学会Windows环境下绘图的基本方法;

(4)能够完成基本的钟表的走时功能、对表功能、定时功能;

1

(5)界面美观大方。 3、创新要求:

在基本要求达到后,可进行创新设计,如定时提醒功能、声音提醒功能、定时运行别的程序的功能等。 4、写出设计说明书

按照设计过程写出设计说明书。 三、设计方法和基本原理: 1、问题描述(功能要求):

要求所编写的闹钟能够完成基本的走时、对时、定时功能。 2、问题的解决方案(参考):

根据题目的要求,可以将问题解决分为以下步骤:

(1)分析问题,画出要解决问题的流程图(类及其层次结构图); (2)利用对话框编辑器完成界面的设计,要求界面要美观实用; (3)添加成员变量和成员函数(消息映射函数);

(4)利用结构化程序的设计思路完成秒针、分针、时针的走动及闹铃指针的设置。

(5)程序功能调试;

(6)完成系统总结报告以及系统使用说明书。 四、设计中涉及到的重要内容及关键技术: 1、对话框应用程序的编写方法及其相关函数; 2、绘图工具的使用方法;

3、一些常用系统API函数的使用方法。 五、程序设计和调试:

编写程序代码、完成程序调试。 六、编写课程设计说明书:

按照课程设计说明书的规范格式要求以及说明书中的内容要求编写课程设计说明书。

七、答辩与评分标准: 1、完成基本功能:40分;

2

2、设计报告及使用说明书:30分; 3、设置错误或者按照要求改变结果:15分; 4、回答问题:15分。

3

摘要

此课程设计的目的是为了达到熟练掌握C++语言的基本知识和C++调试技能;基本掌握面向对象程序设计的基本思路和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题;培养综合利用C++语言进行程序设计的能力。需要设计的模拟时钟程序是基于MFC的WINDOWS应用程序设计,程序运行成功后,页面出现了一个指针式的时钟和数字式的时钟,指针式的时钟表盘为圆形,并且圆周上有分布均匀的12个刻度,刻度要求显示清晰,圆形的钟面上有长度和颜色及粗细各不相同的指针,即时针、分针、秒针,以便各个指针重合时亦可以轻易辨认,指针的运动要求具有规律性,且为顺时针,指针式的时钟表盘下面则是一个以数字形式显示时间的数字钟,数字钟的钟面为一个规则的矩形,其显示时间的格式是时:分:秒,小时为12进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步,且两个时钟所显示的时间与计算机的系统时间相一致,页面的菜单项设有时间设置的栏目,可以对所显示的时间进行调整,能进行调整的具体内容是年、月、日、时、分、秒。此模拟时钟外观简洁,功能和实际运用到的时钟基本一样,用起来非常方便。

关键词:指针式;闹钟;系统时间

4

Abstract

This course is designed for the purpose to achieve proficiency in C + + language basics and C + + debugging skills; basic grasp of object-oriented programming of the basic ideas and methods; able to use what they have learned the basic knowledge and skills to solve simple object-oriented program design issues ; develop comprehensive utilization C + + language programming capabilities. Need to design analog clock program is based on the MFC WINDOWS application design, the program runs successfully, the page there is a pointer clock and digital clock Analog clock dial is circular and is distributed uniformly on the circumference 12 scale, the scale required to display clear, round clock face has length and color and thickness of each are not the same pointer, instant needle, minute, second hand, in order to coincide each pointer can also be easily recognizable, the law requires the movement of the pointer resistance, and is clockwise, Analog clock dial the following is a digital form of display time digital clock, digital clock, clock face is a regular rectangular, its display time format is hours: minutes: seconds, hours of 12 hex, minutes, and seconds is 60 hex, Analog clock and digital clock displays the time synchronization, and the two clocks show the time and the computer's system time is consistent with the menu item page time setting columns, you can adjust the displayed time can be adjusted by the specific content is the year, month, day, hour, minute, second. This analog clock looks simple, functional and practical application to the clock basically the same, and it is very convenient.

Keywords: Analog; Alarm; System Time

5

目录

第一章 引言 ..................................................................... 7

1.1课题背景及意义 .................................................................................... 7 1.2课题的研究方法 .................................................................................... 7

第二章 课程设计目的与要求 ............................................. 8

2.1 课程设计目的 ...................................................................................... 8 2.2 课程设计的实验环境 ............................................................................ 8 2.3 课程设计的预备知识 ............................................................................ 8 2.4 课程设计要求 ...................................................................................... 8

第三章 课程设计内容 .................................................. 10

3.1.功能分析 ............................................................................................ 10 3.2程序流程相应说明 .............................................................................. 10

第四章 软件设计 ........................................................ 12

4.1 设计步骤 ........................................................................................... 12 4.2 界面设计 ........................................................................................... 13 4.3时间显示 ............................................................................................ 14

4.3.1 模拟时钟显示 ........................................................................... 14 4.3.2 状态栏显示时间 ........................................................................ 14 4.3.3定时功能.................................................................................... 15 4.4 测试结果 ........................................................................................... 15 4.5 关键源代码 ........................................................................................ 16

第五章 课程设计总结 ...................................................... 20 致 谢 ............................................................................... 21 参考文献 .......................................................................... 22

6

第一章 引言

1.1课题背景及意义

随着社会的发展,进入21世纪,个人电脑已经进入千家万户,人们已习惯于以互联网的方式交流,学习和娱乐。网上跨国交流也越见频繁,由于时差的关系,人们在浏览国外新闻时经常需要进行时间的换算。不同地区作息时间的不同也影响到人们的交流。一种指针式闹钟的时钟程序,将给人们的生活与交流带来极大地方便。

1.2课题的研究方法

通过对VC++可视化编程的学习以及各地区时间差的查询,本文主要采用MFC控件和多线程编程技术,以及三个与时间有关的函数SetTimer()、OnTimer()和KillTimer(),设计实现一个包含计时器功能和闹钟功能的多时区时钟程序。

7

第二章 课程设计目的与要求

2.1 课程设计目的

将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。

通过课程设计,学生在下述各方面的能力应该得到锻炼:

(1)进一步巩固、加深学生所学专业课程《C++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。

(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。

(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。

(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。

(5)掌握面向对象程序设计的方法。

(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。

(7)进一步掌握在集成环境下如何调试程序(单步调试,设置断点、观察表达式,分块调试)和修改程序。

2.2 课程设计的实验环境

硬件要求能运行Windows 操作系统的微机系统。C++语言应用程序开发软件使用:VC++ 系统,或其他C++语言应用程序开发软件。

2.3 课程设计的预备知识

熟悉C++语言程序设计的基本知识及VC++编辑器的使用方法。

2.4 课程设计要求

利用所学的面向对象及C++编程知识和技巧,通过布置具有一定难度的程序设计题目,并且要求学生独立完成所布置题目,在分析设计过程中,要求学生

8

养成良好的编程习惯,学会分析简单的实际问题,并能利用所学的知识建立系统的逻辑结构,学会简单的调试技巧和方法。根据系统的功能要求,要求学生逐步完成应用程序的设计,具体要求为:

1、按规定的时间及要求上机。

2、设计方案正确,正确划分所选课题的系统功能模块。 3、系统设计要尽量实用,数据与功能分析详细。 4、要求C++编码简洁、稳定、高效。 5、独立查阅资料,认真书写课程设计说明书。

9

第三章 课程设计内容

3.1.功能分析

(1)正确显示系统时钟;

(2)能准确定位时钟刻度和时分秒针的位置;

(3)能够完成基本的钟表的走时功能、对表功能、定时功能;

3.2程序流程相应说明

(1) 程序运行后,出现了以时针、分针和秒针的指针式的时钟和以数字方式显示时间的数字时钟,所显示的时间与电脑同步,程序运行正确。

(2) 绘制指针式的时钟和插入背景时钟图片时,可以运用CView类,CView类提供了视图类所需要的最基本的功能实现,其提供的虚拟方法使应用程序可以重写它们提供CView派生类中的方法,其中OnDraw()函数是重绘视图窗口时被调用, 调用MoveTo和LineTo绘制表盘指针。

(3) 模拟时钟处理消息的过程:首先调用SetTimer函数定义时钟消息,包括参数指定计时器的ID,消息产生的时间间隔等;然后在相应的WM_TIMER消息处理里添加时钟消息响应代码。在该模拟时钟设计的程序中,调用消息处理函数OnTimer()刷新窗口显示。

(4) 要实现时钟的动态效果,即时间窗显示的时间每隔一秒钟更新一次,需要在时间窗格的正文调用CStatusBar::SetPaneText()函数。要定时更新,则应利用WM_TIMER消息。在Window中,用户可以安装一个或多个计时器,计时器每隔一定的时间间隔就会发出一个WM_TIMER消息,而这个时间间隔可由用户指定。MFC的Windows类提供了WM_TIMER消息处理函数OnTimer(),应在该函数内进行更新时间窗格的工作。先利用ClassWazard给CMainFrame类加入WM_TIMER消息处理函数OnTimer(),CMainFrame:: OnTimer()函数是在系统发给框架窗口消息WM_TIMER时调用的,在CMainFrame::OnCreate()函数内调用CWnd::SetTimer()以安装一个计时器,使OnTimer()在设定的时间间隔被调用。

(5) 通过调用GetCurrentTime()函数来实现时钟时间与计算机系统时间保持一致,使时间与计算机同步后。

10

(6) 在程序设计过程之中添加菜单,用菜单项控制弹出对话框设置显示的时间,这样可以使时钟达到可调的效果。

(7) 程序运行正常,界面设置合理,指针式的时钟和数字式的时钟的运动达到任务书的要求,并且能用菜单项控制对话框以实现对当前时间的调整,程序达到各项功能之后,退出界面,程序结束。

11

第四章 软件设计

4.1 设计步骤

使用AppWizard创建一个基于对话框的MFC工程,将之命名为abao。所有步骤均使用AppWizard给出的默认设置, 完成对话框的创建。

在CmainFrame类中加入消息处理函数OnTimer(),在OnCreate()中添加代码,在CmainFrame::OnDraw(CDC* pDC)中显示背景图片以及调整,添加指针代码,在CMainFrame::OnTimer(UINT nIDEvent)中添加输出数字时钟的代码。

(3) 在Resource View选项卡中打开Menu资源组,双击IDR_MAINFRAME,在菜单项中添加一个“设置”的控件,再在“设置”的目录下添加一个“时间”的控件,设ID为IDC_EDIT_SET,通过ClassWizard为菜单连接对话框类CInputDlg,使菜单便能在程序运行后显示在应用程序主对话框上,菜单效果图如图2所示。

图2 菜单效果图

(4) 在Resource View选项卡中打开Dialog资源组,新建并双击IDD_DIALOG1,

在出现的对话框中添加所需的控件,根据需要对其属性进行修改,并建立类向导,编辑框效果图如图3所示。

12

图3 编辑框效果图

(5) 在头文件中添加对各种函数及变量的声明,同时在类的原文件中添加实现功能所需要的各种函数,并添加相应的代码。

(6) 对完成后的程序不断进行调试,分析并修改其中的错误,直到程序运行不再报错,并能够实现所要求的各项功能。

4.2 界面设计

模拟时钟的界面设计比较简单,如图3所示,只需6个编辑框和相应的6个静态文本框,由于显示的时间都是整数,所以控件的类型都选为int型,因而所需要设计的控件也比较简单,界面设计的控件表如表1所示。

表1 界面控件表

控件序号 控件名称 1 2 时 分 控件类型 编辑框(CString) 编辑框(CString) 控件ID IDC_hour IDC_minute 3 秒 编辑框(CString) IDC_second

m_c 相应变量 m_a m_b 13

4.3时间显示 4.3.1 模拟时钟显示

模拟时钟的显示主要在于插入和绘图这两方面,也是本次模拟时钟课程设计的重中之重。这一部分所要添加的代码在File View选项卡中的Source File资源组里CCK52View.cpp中:

(1) 首先要调用SetTimer()函数设置时间间隔,语句是SetTimer(1,1000,NULL),SetTimer()的第一个参数指定计时器ID为1,第二个参数规定了计时器的时间间隔为1000ms,即1s,这样,每隔1s就调用一次OnTimer()函数。

(2)定义画笔hourPen、minutePen1、secondPen2分别为时针、分针、秒针的画笔。通过插入图片的位置以及图片长宽确定时针、分针和秒针的位置,并根据所取系统时间GetHour()、GetMinute()、GetSecond()来决定时针、分针和秒针的转向。

4.3.2 状态栏显示时间

先在在

String Table

中添加

New String,在此定义为

ID_INDICATOR_CLOCK,将其Caption设为00:00:00,对应的Value值加1(可在resource.h中修改)。在MainFrm.cpp中indicators声明处添加ID_INDICATOR_CLOCK,代码如下: static UINT indicators[] = {

ID_SEPARATOR,

ID_INDICATOR_CLOCK, //这里排列影响显示顺序 ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, };

然后在CMainFrame::OnTimer(UINT nIDEvent) 中添加如下代码使得状态

14

栏时间随系统时间变化而变化: CTime time;

time=CTime::GetCurrentTime();//得到当前时间 CString s=time.Format(\转换时间格式

m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s); //显示时钟

4.3.3定时功能

要实现定时功能,需要在CMainFrame::OnTimer(UINT nIDEvent) 中添加如下代码:

//获取当前系统时间显示到静态文本框time上 CString str;

CTime t = CTime::GetCurrentTime(); str.Format(\时%d分%d秒\

t.GetHour(),t.GetMinute(),t.GetSecond()); //判断当前时间与设定时间是否一致 if (s==str) { }

PlaySound(\MessageBox(str,\

4.4 测试结果

经分析程序错误原因并加以改正之后进行调试、程序编译、连接无错误后,程序能正确运行,图4显示了程序运行后模拟时钟以及打开菜单项的界面。

15

图4 程序运行图

经测试,程序运行成功后,出现了指针式的时钟和数字式的时钟,二者时间与计算机同步,时针、分针和秒针形象美观,即使各指针重合也可辨认,各项功能正常。

4.5 关键源代码

模拟时钟的源代码关键在对于时钟的绘制和设置计时器上,添加的代码在File View选项卡中的Source File资源组里面的CCK52View.cpp中,以下代码是关于模拟时钟的绘制:

void CCk52View::OnDraw(CDC* pDC) {

CBitmap bmp;

//bmp位图对象

bmp.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP3为图像对象的ID BITMAP bmpInfo;

//位图信息对象

bmp.GetBitmap(&bmpInfo); //获取位图信息 CDC dcMemory,*dc; dc=GetDC();

//在内存中创建一个位图兼容设备

//获取设备上下文对象的类dc

//创建内存位图兼容设备

dcMemory.CreateCompatibleDC(dc);

16

CBitmap *pOldBmp=dcMemory.SelectObject(&bmp); //将图片选入兼容设备

//将兼容设备的内容copy到屏幕设备中,实现真正的Paint dc->BitBlt(300, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY); //将设备还原

dcMemory.SelectObject(pOldBmp);

CPen pen(PS_SOLID,2,RGB(255,255,0));

CPen *pOldPen=(CPen*)pDC -> SelectObject(&pen);

static const double pi=3.1415926535; double rate = (double)(2.0 * pi / 60.0); double halfPi=pi/2; int zoomR=160;

CTime time = CTime::GetCurrentTime(); int hour = time.GetHour(); int minute = time.GetMinute(); int second = time.GetSecond(); int x0=bmpInfo.bmWidth/2+300; int y0=bmpInfo.bmHeight/2;

//绘制秒数指针

CPen secondPen(PS_SOLID,3,RGB(200,0,0)); pDC -> SelectObject(secondPen); pDC -> MoveTo(CPoint(x0,y0));

int secondX = (int)((zoomR-22) * sin(rate * second)+ x0); int secondY = (int)(-(zoomR-22) * sin(rate * second +halfPi)+ y0); pDC -> LineTo(CPoint(secondX,secondY));

17

//绘制分钟数指针

CPen minutePen(PS_SOLID,8,RGB(0,255,0)); pDC -> SelectObject(minutePen); pDC -> MoveTo(CPoint(x0,y0));

int minuteX = (int)((zoomR-60) * sin(rate * minute)+ x0); int minuteY = (int)(-(zoomR-60) * sin(rate * minute +halfPi)+ y0); pDC -> LineTo(CPoint(minuteX,minuteY)); //绘制小时数指针*/

double hourRate=(double)(2.0*pi/12.0); if(hour > 12) { }

CPen hourPen(PS_SOLID,12,RGB(0,0,255)); pDC -> SelectObject(hourPen); pDC -> MoveTo(CPoint(x0,y0));

int hourX = (int)((zoomR-100) * sin(hourRate * hour )+ x0); int hourY = (int)(-(zoomR-100) * sin(hourRate * hour +halfPi)+ y0); pDC -> LineTo(CPoint(hourX,hourY));

CCk52Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

// TODO: add draw code for native data here }

设定闹钟时间代码如下: void Cabao::OnOK() {

// TODO: Add extra validation here UpdateData(TRUE);

hour -= 12;

18

s=m_a+\时\分\秒\ MessageBox(s,\设定成功\ SetTimer(2,1000,NULL); CDialog::OnOK(); }

定时器状态栏显示系统时间以及判断闹钟是否时间到代码如下: void CMainFrame::OnTimer(UINT nIDEvent) {

// TODO: Add your message handler code here and/or call default //获取当前系统时间显示到静态文本框time上 CString str;

CTime t = CTime::GetCurrentTime(); str.Format(\时%d分%d秒\

t.GetHour(),t.GetMinute(),t.GetSecond()); //判断当前时间与设定时间是否一致 if (s==str) { }

Invalidate(); CTime time;

time=CTime::GetCurrentTime();//得到当前时间 CString s=time.Format(\转换时间格式

m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s); //显示时钟 CFrameWnd::OnTimer(nIDEvent);

PlaySound(\MessageBox(str,\

19

第五章 课程设计总结

经过以上步骤,课程设计所要求设计的模拟时钟便成功完成了,它能显示指针式和数字式的时钟,并且与计算机系统时间保持一致,也可以打开菜单项进行闹钟设置。整个页面简洁清晰,方便用户读取,且操作简捷,符合课程设计中的各项要求。通过这次课程设计,我们对日常生活中司空见惯的时钟的工作原理有了一个比较深入的了解,将书本中的知识更好地与实际生活中的应用结合在了一起。

在这次模拟时钟的课程设计中,我们在Visual C++ 6.0环境下,编写MFC的Windows应用程序。MFC定义了一个标准的应用程序框架,为我们提供了大量可重用代码,隐藏了程序设计中的许多复杂工作,在程序编写中,通过使用原有的类和派生新的类,各种控件的添加,类的连接,菜单设计,消息添加,函数编写,使我对面向对象程序设计有了深刻认识,掌握了程序调试方法,大大提高了编程能力和动手能力。

在程序的调试过程之中,可以说是困难重重,特别是对模拟时钟的绘制,更是此次对于模拟时钟设计过程中的重点,绘制的过程之中要考虑表盘坐标的定位,时钟的时针、分针和秒针的长短、粗细以及颜色的选取,以便指针重合时用户也可轻易辨认,还要考虑指针式的时钟与数字式的时钟与系统时间保持一致。在不断的改正错误和调试的过程之中,所要求设计的模拟时钟总算是运行成功。

到此为止,我们接近两周的课程设计也告一段落。通过这次课程设计,使我认识到理论与实际相结合的重要性,对课本上的只是在实际生活中的运用也有了进一步的了解,同时基本上能够掌握Visual C++编程中的对话框编程的步骤,可以说是从中受益匪浅。

20

致 谢

本说明书和闹钟程序是在指导老师悉心指导下和同学的耐心帮助下完成的。这次课程设计能够顺利的完成,要感谢老师同学的帮助。

首先要感谢是指导老师,在技术上给了我很大的帮助和启发,当我遇到困难的时候,不知如何去解决时,就会寻求老师的指导,指导老师会很有耐心的为我讲解;感谢我的指导老师,他循循善诱的教导和不拘一格的思路给予了我很多的启发和帮助。

感谢班上同学对我的帮助和指点。没有他们的帮助,对于我一个对编程知识不是很精通的人来说,要想在短短的的时间里完成一个系统的软件设计是一件很困难的事情。在一些小问题上,只要能够解答,同学都会尽力帮助我,让我不至于在设计时一直止步不前。感谢同学的耐心帮助和指点。

在此表示最诚挚的感谢!

21

参考文献

[1] 徐静芬.C++语言程序设计.辽宁.广播大学出版社,2008 [2] 黄明明.C++语言程序设计基础.上海.电子工业出版社,2006 [3] 钱能舒.C++程序设计教程.武汉.华中科技大学出版社,2006 [4] 郑飞倩,董安.C++语言.北京.清华大学出版社,2005 [5] 吴华恩.C++程序设计.北京.机械工业出版社,2008 [6] Devied.C/C++程序设计.北京.中国铁道出版社,2006 [7] 洪永清.面向对象的系统分析.天津.天津大学出版社,2004 [8]谭浩强.面向对象建模.武汉.科技大学出版社,2006 [9]邵伟忠.C常用算法程序集.天津.人民大学出版社,2004 [10]徐世亮.C++大学教程.北京.人民邮电出版社,2006

22

本文来源:https://www.bwwdw.com/article/ng6p.html

Top