指针式闹钟
更新时间:2024-04-12 15:44:01 阅读量: 综合文库 文档下载
VC++程序设计 报告
指针式时钟
靳洪都 电子信息工程学院 自动化 0701 班
07212008VC++程序设计报告 1 目 录
一、实验目的????????2 二、运行环境????????2 三、功能要求????????2 四、条件限制????????2 五、整体设计流程图?????2 六、数据描述????????2 七、用户界面????????3 八、程序设计框架及步骤???3 九、问题与调试???????14 十、实验感想????????15
十一、 参考资料???????15VC++程序设计报告 2
指针式时钟 一、 实验目的
利用 Visual C++设计一个闹钟程序,定时事件提醒等。本题目 涉及使用设备上下文进行绘图和定时器的应用。 二、 运行环境
操作系统 Microsoft Windows 三、 功能要求
1 时针、秒针、秒针功能 2 日期显示
3 可增加万年历功能 四、 条件与限制
此软件嵌入闹钟程序,当时间到了的时候会有声音响起,但是 声音的路径使用的是觉得路径,软件的移植性有待于改进。 五、 整体设计流程图 六、 数据描述 1、 静态数据
表盘的绘制、表盘的刻度 主框架窗口
万年历 闹钟VC++程序设计报告 3
2、 动态数据
闹钟的时、分、秒数据的输入;当前时刻表盘时分秒针运 行的数据。 七、 用户界面
八、 程序设计框架及步骤
1、打开 VC++6.0,新建一个 MFC AppWizard(exe),工程名称为 shizhong。选择单文档窗口,点击完成就可以创建成功。 2、在 CMainFrame 类中的 OnCreat 中设置定时器。 SetTimer(1,1000,NULL);
先看 SetTimer 这个 API 函数的原型 UINT_PTR SetTimer (
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器 ID,多个定时器时,可以通 过该 ID 判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒 TIMERPROC lpTimerFunc // 回调函数 );
当不需要计时器的时候调用 KillTimer(nIDEvent);
3、添加 WM_TIMER 消息响应函数 加入 Invalidate();//重绘窗口 该函数的作用是使整个窗口客户区无效。窗口的客户区无效意 味着需要重绘。
4、在 View 类中的 OnDraw( )中对表盘进行绘制,代码如下: CPen pen(PS_SOLID,2,RGB(255,255,0));
CPen *pOldPen=(CPen*)pDC -> SelectObject(&pen); static const double pi=3.1415926535; //得到客户区的矩形 CRect rect;
GetClientRect(&rect);
//得到表盘中央位置,即圆心
int x0 = rect.Width() / 2;VC++程序设计报告 5
int y0 = rect.Height() / 2; //得到半径
int r = (x0 > y0 ? y0 : x0);
pDC->Ellipse(CRect(x0-r,y0-r,x0+r,y0+r));//画最外侧的椭 圆
//pDC->SelectObject(oldpen); //Pen.Detach();
//Pen.CreatePen(0,0,RGB(0,0,200)); //CPen Pen2(PS_SOLID,1,RGB(0,0,0)); //pDC -> SelectObject(&Pen);
CPen Pen1(PS_SOLID,2,RGB(255,0,0)); pDC -> SelectObject(Pen1);
pDC->Ellipse(CRect(x0-r+3,y0-r+3,x0+r-3,y0+r-3));//画最 外侧的椭圆
CPen Pen2(PS_DOT,2,RGB(0,255,0)); pDC -> SelectObject(Pen2);
pDC->Ellipse(CRect(x0-r+6,y0-r+6,x0+r-6,y0+r-6));//画最 外侧的椭圆
pDC->Ellipse(CRect(x0-r+35,y0-r+35,x0+r-35,y0+r-35)); CPen Pen3(PS_SOLID,3,RGB(0,0,255)); pDC -> SelectObject(Pen3);
//将要在循环中重复的计算提取出来,减少时间复杂度VC++程序设计报告 6
double rate = (double)(2.0 * pi / 60.0); double halfPi=pi/2; int zoomR=r-20; //绘制表盘
//zoomR 及对 zoomR 进行加或减操作主要是用来控制距离圆心的 距离
pDC->SetBkMode(TRANSPARENT); for(int mark=1;mark<=60;mark++) {
int positionX = (int)(zoomR * sin(rate * mark)+ x0); int positionY = (int)(-zoomR * sin(rate * mark + halfPi)+ y0);
if(mark % 5 ==0){ char number[2];
itoa(mark/5,number,10);//按照十进制转换 //绘制数值
pDC -> TextOut(positionX-5,positionY-5,number); } else {
//绘制刻度
//pDC ->VC++程序设计报告 7
SetPixel(positionX,positionY,RGB(200,100,0)); pDC ->
Ellipse(positionX-2,positionY-2,positionX+2,positionY+2 ); } }
CTime time = CTime::GetCurrentTime(); int hour = time.GetHour(); int minute = time.GetMinute(); int second = time.GetSecond(); //绘制秒数指针
CPen secondPen(PS_SOLID,3,RGB(200,0,0));
pDC -> SelectObject(secondPen); pDC -> MoveTo(CPoint(x0,y0));
int secondX = (int)((zoomR-25) * sin(rate * second)+ x0); int secondY = (int)(-(zoomR-25) * sin(rate * second + halfPi)+ y0);
pDC -> LineTo(CPoint(secondX,secondY)); //绘制分钟数指针
CPen minutePen(PS_SOLID,7,RGB(0,255,0)); pDC -> SelectObject(minutePen);
pDC -> MoveTo(CPoint(x0,y0));VC++程序设计报告 8
int minuteX = (int)((zoomR-70) * sin(rate * minute)+ x0); int minuteY = (int)(-(zoomR-70) * sin(rate * minute + halfPi)+ y0);
pDC -> LineTo(CPoint(minuteX,minuteY)); //绘制小时数指针*/
double hourRate=(double)(2.0*pi/12.0); if(hour > 12) {
hour -= 12; }
CPen hourPen(PS_SOLID,10,RGB(0,0,255)); pDC -> SelectObject(hourPen); pDC -> MoveTo(CPoint(x0,y0));
int hourX = (int)((zoomR-140) * sin(hourRate * hour )+ x0); int hourY = (int)(-(zoomR-140) * sin(hourRate * hour + halfPi)+ y0);
pDC -> LineTo(CPoint(hourX,hourY));
5、添加对话框
1)选择“插入”-“资源”菜单,选中 Dialog,单击确定按钮,系 统就可以自动为当前应用程序添加一个对话框。
2)设置对话框属性。在对话框模板的空白处右击鼠标,从弹出的快 捷菜单中选择属性菜单项,然后对相应的参数进行设置。
3)添加和布局控件。一旦对话框资源被打开或者是创建,就会出现 对话框编辑器,通过它我们就可以对对话框进行编辑。 4)创建对话框类
在对话框资源模板的空白处双击鼠标,弹出创建一个新类的对话框。
在 Name 框中输入用户定义的类名。在这里一般以“C”字母开始,单击 OK 按钮,一个基于对话框资源模板的对话框类就创建好了。 6、在程序中使用对话框
1)在项目工作区窗口中选择 ResourceView 页面,双击资源 Menu 项 中的 IDR_MAINFRAME,则就会出现菜单编辑器。在菜单的空白处添加
一个菜单项。 添加后的结果是:
2)在菜单的空位置处双击鼠标左键,则会出现他的属性对话框,在标 题框中输入“设置”。
3)单击“设置”菜单项下方的空位置,在属性对话框中,输入“闹 钟”在 ID 框中输入该菜单的资源标识:ID_TEST_DLG,然后单击属性 对话框右上角的关闭按钮。
4)用鼠标将新添加的菜单项拖到“文件”和“编辑”之间。
5)选择“查看”-“建立类向导”菜单命令,则出现 MFC ClassWizard 对话框,并自动切换到 Message Map 页面。从 Class name 列表中选
择 CMainFrame,在 IDs 列表中选择 ID_TEST_DLG。然后在 Message 框 中选择 COMMAND 消息。
6)单击 Add Function 按钮,出现 Add Member Function 对话框以输 入成员函数的名称。系统的默认名称是 OntestDlg。该函数是对菜单 菜单的空白处
项 ID_TEST_DLG 的映射,也就是说,当在应用程序运行时,用户选择 “对话框”,则该函数 OntestDlg 别调用,执行该函数的代码。
7)单击 OK 按钮,在 ClassWizard 的 Member function 列表中将列出 新增加的成员函数。选择此函数,单击 Edit Code 按钮,在此成员函 数中添加下面的代码:
void CMainFrame::OnTestDlg() {
CFirstDlg dlg;//定义对话框类对象 dlg.DoModal();//显示对话框 }
8)在 OnTestDlg 函数的实现文件 MainFrm.cpp 的前面添加 CFirstDlg 类包含语句,即
#include \#include \7、闹钟功能的实现
1)在闹钟对话框中添加三个组合框,分别是时、分、秒。在属性中 的数据项目中添加应该显示的数据。如下图: 2)添加好的结果如图:
3)对话框的 OK 按钮响应函数,使得程序提取到闹钟的三个参数, 并且启动定时器 2
void CMainFrame::OnNaozhong() {
// TODO: Add your command handler code here naozhong dlg;
if(dlg.DoModal()==IDOK) {
second=dlg.second;
minute=dlg.minute; hour=dlg.hour; }
SetTimer(2,500,NULL); }
4)更新 CMainFrame 中的 timer 函数,使得每秒钟将获取的闹钟的参 数与系统当前的时间比较,如果两个数值相等,则响应弹出一个对话 框,并且 PlaySound 函数别响应,播放声音。 void CMainFrame::OnTimer(UINT nIDEvent) {
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1) Invalidate();
else if(nIDEvent==2) {
CTime tm; int am;
tm=tm.GetCurrentTime(); if(second==tm.GetSecond()) {
if(minute==tm.GetMinute()) {
if(hour==tm.GetHour())//time.GetHour() {
KillTimer(2);
PlaySound(\靳洪都\\\\Desktop\\\\自
己的程序 第三版\\\\shizhong\\\\ring.wav\SND_ASYNC);
MessageBox(\时间到!\} } } }
CFrameWnd::OnTimer(nIDEvent); }
九、 问题与调试
1) 开始设计的时候,绘制的表盘会因为对话框的变化而编写, 成为椭圆。采用的纠正方法是,首先分别获取窗体的长和 宽,然后去两者之间的较小的一个的一半作为表盘的半径, 这样就避免了这样的问题的发生。
2) 程序存在的一个问题就是声音路径使用的是绝对路径,应 该是使用相对路径,但是由于自己对 VC 的学习还比较欠 缺,这个问题还没有解决。
3) 在对于画笔和画刷的使用上,也经过了一定的过程。开始 的时候,定义使用的画笔只能画出一种颜色。VC++程序设计报告 15
十、 实验感想
虽然这次实验的时间比较紧,但是自己收获了很多的东西。 有一句 VC++的话流传甚广,说“偷懒的人学 VB,聪明的人学 Delphi,正在的程序员学 VC”。从这句话里面我们可以看书 VC 应用的广泛性,另一方面我们也可以看出学习 VC 也不是一件容 易的事情。
由于之前做项目的时候实验的是 VB,对面向对象的程序设 计有了一定的了解,并且还学过 C++的课程,对类和对象也有 一定的了解。但是经过一段时间的学习,还是发现 VC 和其他的 变成语言还是有很大的差距的,曾经一段时间自己很迷糊,根 本对 VC 就无从下手。但是经过看参考书,再就是参考了一下孙 鑫的 VC++视频教程,逐渐对 VC 有了认识,并一步步的深入了 解。
借此次课程设计的机会,加深了自己对计算机编程的兴趣, 当然也趁此机会学习了 VC 的编程。 十一、参考文献
【1】VC++深入详解 孙鑫,余安萍 电子工业出版社 【2】Visual C++教程 郑阿奇,丁有和 机械工业出版社 【3】Visual C++程序设计技巧与实例 徐福 中国铁道出版社
正在阅读:
指针式闹钟04-12
《影视艺术概论》教学大纲01-16
采矿工程专业认识实习大纲03-08
医师申请变更注册10-18
教师培训工作计划03-08
珠海市2014届高三上学期期末数学文10-17
难忘的一个老师作文600字06-16
wingdings字体,webdings字体,RGB颜色对照表08-13
20世纪西方文论原文03-05
教师节赞美诗_教师节祝福语03-26
- 《江苏省环境水质(地表水)自动监测预警系统运行管理办法(试行)》
- 安乐死合法化辩论赛立论稿(浙大新生赛)
- 公共科目模拟试卷公务员考试资料
- 我国固定资产投资FAI对GDP的影响
- 大学生创新创业训练计划项目申请书大创项目申报表
- 完美版—单片机控制步进电机
- 2013资阳中考化学试题
- 18.两位数减一位数退位(397道)
- 工程量计算规则
- 二年级操行评语(下)
- 第3章 流程控制语句
- 浅基桥墩加固技术
- 课题研究的主要方法
- 5100软件说明书 - 图文
- 车间技术员年终总结
- 关于印发《中铁建工集团开展项目管理实验室活动方案》的通知
- 经典诵读结题报告
- 地下水动力学习题答案
- 2018年全国各地高考数学模拟试题平面解析几何试题汇编(含答案解
- 街道办事处主任2018年度述职述廉报告
- 指针式
- 闹钟
- 5-2018问卷调查内容全国未成年人思想道德建设工作测评体系(2018
- 施工员(市政方向)通用与基础知识 试卷B
- 2017年版中国社区服务行业分析报告目录
- 13年公考-电子讲义-2013年省考基础班公共基础知识-石鸣-61页
- 航空发动机燃烧室调研报告 - 图文
- ZTE ZXSDR GSM WCDMA B8200&R8860调试指导手册初稿 - 图文
- 黄金考试模拟题1
- 威海电厂三期生产准备工作总结
- 复杂网络电力系统的潮流计算步骤?
- 董事聘用合同
- 2015年自然科学基金资助重点领域
- 超市选址策略
- 2017年幸福心理学(课后题答案)
- 2018秋--贵州版小学三年级上册三年级综合实践教案(1)
- 以学习任务单为抓手,开拓语文教学新模式
- 数字电路时钟 - 图文
- 中国松香市场研究报告目录
- 新中国第一次:授衔的元帅、大将、上将、中将名录
- 结对帮扶心得体会
- 刘丰-文采速成法