指针式闹钟

更新时间: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++程序设计技巧与实例 徐福 中国铁道出版社

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

Top