用VC++制作 模拟时钟应用程序
计算机图形学 MFC VC++6.0制作的简单时钟源代码

// TODO: Add your command handler code here
Timer=1;
SetTimer(1,100,NULL);
}
void CMFCFrame1View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
{
// dቤተ መጻሕፍቲ ባይዱfault preparation
return DoPreparePrinting(pInfo);
}
void CMFCFrame1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
// CMFCFrame1View drawing
/////////////////////////////////////////////////////////////////////////////
// CMFCFrame1View printing
BOOL CMFCFrame1View::OnPreparePrinting(CPrintInfo* pInfo)
// CMFCFrame1View
IMPLEMENT_DYNCREATE(CMFCFrame1View, CView)
BEGIN_MESSAGE_MAP(CMFCFrame1View, CView)
//{{AFX_MSG_MAP(CMFCFrame1View)
ON_WM_CREATE()
VC3053多时区时钟软件的设计与实现2

多时区时钟软件的设计与实现摘要进入21世纪以来,电脑用户数迅速增长,网上的跨国交流也越见频繁,由于时差的关系,不同国家的作息不同,因此需要经常进行时间的切换。
本系统主要论述如何利用VC++6.0应用程序开发环境和微软基础类库(MFC),设计与实现一个基于对话框的多时区时钟软件。
该软件主要包括时钟显示,闹钟报时以及计时器功能。
其中,时钟显示包含单时区时钟显示和多时区时钟显示,计时器可实现倒计时与正常计时。
利用MFC中与定时器相关的函数,实现计时和时钟的定时刷新;运用模运算实现不同时区的时间转换;采用多线程技术使三个时钟同时运行。
关键词:VC++;MFC;时钟;多线程目录论文总页数:27页1 引言......................................................................................................... 错误!未定义书签。
1.1课题背景及意义................................................................................... 错误!未定义书签。
1.2 课题的研究方法.................................................................................. 错误!未定义书签。
2 程序功能描述........................................................................................... 错误!未定义书签。
2.1 时钟显示.............................................................................................. 错误!未定义书签。
用c语言实现钟表

1. 引入所需的头文件:你需要引入一些头文件来实现程序的功能,例如 stdio.h、stdlib.h、time.h 等。
2. 定义程序的数据结构:你可以定义一个结构体来表示钟表的时间,包括时、分、秒等字段。
3. 获取当前时间:使用 time 函数获取当前系统时间,并将其转换为时、分、秒等字段。
localTime->tm_sec);
22.
23.
// 暂停一秒钟
Байду номын сангаас
24.
sleep(1);
25. }
26.
27. return 0;
28. }
29. 这个程序会不断获取当前系统时间,并输出格式为"时:分:秒"的钟表界面。程序会每 秒钟更新一次时间,并在终端上显示。你可以根据需要进行适当的修改和扩展,例
time_t currentTime = time(NULL);
17.
struct tm *localTime = localtime(¤tTime);
18.
19.
// 输出钟表界面
20.
system("clear"); // 清屏(适用于 Linux 和 Mac)
21.
printf("%02d:%02d:%02d\n", localTime->tm_hour, localTime->tm_min,
7. 下面是一个简单的 C 语言实现钟表的代码示例:
8. c 复制代码
9. #include <stdio.h>
10. #include <stdlib.h>
vc编写一个模拟时钟的程序(VC write an analog clock program)

vc编写一个模拟时钟的程序(VC write an analog clock program)I'm sorry, my program is too big, 4M, because there are other functionsNo way. Towel section proceduresVoid CFill_areaView:: myShowColok (CDC, *pDC){M_time=CTime:: GetCurrentTime ();PDC->FillRect (&CRect (0,0, rect.Width (), rect.Height ()), &CBrush (RGB (100100100));CBrush brush (RGB (150150150));CBrush *oldbrush=pDC->SelectObject (&brush);CPen pen (PS_SOLID, 3, RGB (0,0,0));CPen *oldpen=pDC->SelectObject (&pen);PDC->Ellipse (rect.Width (), /2- (rect.Height ()), /2, rect.Height () (/2-10 ()), /2- (rect.Height ()), /2, rect.Width (), /2+ (rect.Height ()), /2, rect.Height () (&CRect (), /2+ (rect.Height ()), /2-10 (/2-10) /2) /2-10 ());PDC->Ellipse (&CRect (rect.Width ()), /2-3, rect.Height (), /2-3, rect.Width (), /2+3, rect.Height () /2+3);CPen PEN2 (PS_SOLID, 7, RGB (0,0,0));PDC->SelectObject (&pen2);PDC->MoveTo (rect.Width (), /2, rect.Height (), /2-16* (rect.Height (), /2-10) /20);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20, rect.Height (), /2-6* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20, rect.Height (), /2-6* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2, rect.Height (), /2-16* (rect.Height (), /2-10) /20);PDC->MoveTo (rect.Width (), /2-15* (rect.Height ()), /20+25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20+25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20+25+40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2-15* (rect.Height ()), /20+25+40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->MoveTo (rect.Width (), /2+15* (rect.Height ()), /20-25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20-25, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20-25-40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20+30 (/2-10);PDC->LineTo (rect.Width (), /2+15* (rect.Height ()), /20-25-40, rect.Height (), /2+12* (rect.Height ()) /2-10) /20 (/2-10);CPen pen1 (PS_SOLID, 1, RGB (0,0,0));PDC->SelectObject (&pen1);Double alpha=0;MyPoint, P1, P2, p3;P1=m_pointColok[0], p2=m_pointColok[4], p3=m_pointColok[5];For (int i=0; i<=60; i++){Alpha=i*6*pi/180;P1.x=m_pointColok[0].x*cos (alpha) -m_pointColok[0].y*sin (alpha);P1.y=m_pointColok[0].x*sin (alpha) +m_pointColok[0].y*cos (alpha);PDC->MoveTo (ChangePoint (P1).X, ChangePoint (P1).Y);P2.x=m_pointColok[4].x*cos (alpha) -m_pointColok[4].y*sin (alpha);P2.y=m_pointColok[4].x*sin (alpha) +m_pointColok[4].y*cos (alpha);P3.x=m_pointColok[5].x*cos (alpha) -m_pointColok[5].y*sin (alpha);P3.y=m_pointColok[5].x*sin (alpha) +m_pointColok[5].y*cos (alpha);If (i%5==0)PDC->LineTo (ChangePoint (P2).X, ChangePoint (P2).Y);ElsePDC->LineTo (ChangePoint (P3).X, ChangePoint (P3).Y);PDC->SetBkMode (TRANSPARENT);CFont font;Font.CreateFont (16,12,0,0, FW_NORMAL),假,假,假,ansi_charset,out_default_precis,clip_default_precis,default_quality,default_pitch | ff_swiss,“Arial”);CFont * oldfont = PDC -> SelectObject(与字体);/ /改变字体PDC -> SetTextColor(RGB(255205100));PDC -> TextOut(矩形。
VC计算器-小闹钟-通讯录设计(含源文件)

面向对象Windows程序设计选题:计算器、小闹钟、通讯录学号:姓名:院(系):信息工程学院专业:信息完成日期:指导老师:老师题目一:利用MFC框架编写简易计算器一.需求分析即要实现简单计算器的功能,包括加、减、乘、除等运算功能,还要实现数据的输入、输出、计算、显示及程序退出等功能。
二.总体设计1.程序的创建.使用软件Visual C++ 6.0.,首先,新建一个MFC 基于对话框的工程。
点击文件-新建,在工程选项卡里选择MFC AppWizard[exe],给工程命名Jisuan。
点击确定。
创建一个基于对话框的应用程序。
2.界面的设计按如图所示向对话框添加控件,且按如图所示一样排版。
4.为控件添加成员变量和消息处理函数为IDC_FIRNUM 增加一个变量,点Add Variable…,我们为它增加一个 float 型的变量,命名为m_Firnum。
给第二个编辑框增加float变量m_Secnum。
第三个编辑框增加float变量m_Result。
按ctrl+w选择第一个选项卡 Message Maps,从IDs 中选择IDC_JIA,即加这个按钮,从 Messages 中选择 BN_CLICKED,即当被单击的时候,然后点 AddFunction…为其添加函数然后弹出对话框,为函数命名,选择默认即可,点击OK。
同样为-,*,/添加一样的响应函数。
结果如图:三、编程说明与实现添加如下代码:void CJisuanDlg::OnJia(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum+m_Secnum;UpdateData(false);}void CJisuanDlg::OnJian(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum-m_Secnum;UpdateData(false);}void CJisuanDlg::OnCheng(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum*m_Secnum;UpdateData(false);}void CJisuanDlg::OnChu(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum/m_Secnum;UpdateData(false);}这里有一个UpdateData(Bool)函数。
MFC之模拟时钟

MFC之模拟时钟最近在学习MFC,程序设计⽼师布置”画板“和”模拟时钟“作为实验来实践,由于没去上课,⽹上搜索的很多教程⼏乎都是以VC6.0为基础的,⽽⾝边⼏乎都是VS2008以上,对于初学者来说,有时仿照VC6.0的教程在VS2008或更⾼的环境上难免会出现⼀些困难,特此将模拟时钟程序在VS2008环境下的开发过程总结如下:1.新建项⽬项⽬类型选择“MFC”,模板选择“MFC应⽤程序”,名称⾃拟,这⾥命名为”Clock"。
选择好以后效果如下:2.MFC应⽤程序向导设置选择“下⼀步"这⾥有两个更改,⼀是”应⽤程序类型”选择“基于对话框”,同时取消选中“使⽤Unicode库”。
完成以上两步之后,直接单击“完成”即可。
三、核⼼部分1.⾸先打开“类视图”,选择"CClockDlg"在该类的头⽂件中,找到如下代码:紧接着后⾯添加三个变量⽤于临时保存时间的秒、分、时。
int m_Sec, m_Min, m_Hour;插⼊后的效果如下:2.⼿动添加⼀个消息映射函数,完成时间的获取和指针的绘制。
在CClockDlg类的头⽂件中找到如下代码:在其中增加⼀⾏如下:afx_msg void OnTimer(UINT nIDEvent);增加后显⽰效果如下:接着在资源管理器中找到CClockDlg类的cpp⽂件来实现刚才的函数声明需要添加的代码如下:1void CClockDlg::OnTimer(UINT nIDEvent)2 {3// TODO: Add your message handler code here and/or call default4 CTime time = CTime::GetCurrentTime(); //获得系统时间5 m_Sec = time.GetSecond();6 m_Min = time.GetMinute();7 m_Hour = time.GetHour();89 CDC* pDC = GetDC();10 CRect rect;11 GetClientRect(&rect); //获取客户区域12 CBitmap bitmap; //定义图⽚类13 bitmap.LoadBitmap(IDB_BITMAP1); //加载位图14 CDC memdc; //定义临时画布15 memdc.CreateCompatibleDC(pDC); //创建画布16 memdc.SelectObject(&bitmap); //关联图⽚1718int x = rect.Width()/2;19int y = rect.Height()/2;2021 CPen MinutePen(PS_SOLID,2,RGB(0,0,0)); //设置分针画笔22 memdc.SelectObject(&MinutePen);23 memdc.MoveTo(x,y);24//绘制分针25 memdc.LineTo(x+(long)40*cos(PI/2-2*PI*m_Min/60.0),y-(long)40*sin(PI/2-2*PI*m_Min/60.0));26 CPen HourPen(PS_SOLID,3,RGB(0,0,0)); //设置时针画笔27 memdc.SelectObject(&HourPen);28 memdc.MoveTo(x,y);29//绘制时针30 memdc.LineTo(x+(long)30*cos(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0))31 ,y-(long)30*sin(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0)));32 CPen SecondPen(PS_SOLID,1,RGB(255,0,0)); //设置秒针画笔33 memdc.SelectObject(&SecondPen);34 memdc.MoveTo(x,y);35 memdc.LineTo(x+(long)50*cos(PI/2-2*PI*m_Sec/60.0),y-(long)50*sin(PI/2-2*PI*m_Sec/60.0));//绘制秒针36 memdc.MoveTo(x,y);37 memdc.LineTo(x+(long)10*cos(PI/2-2*PI*(m_Sec+30)/60.0),y-(long)10*sin(PI/2-2*PI*(m_Sec+30)/60.0));//绘制秒针38 SecondPen.DeleteObject();39 MinutePen.DeleteObject();40 HourPen.DeleteObject();41 pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY); //复制图⽚42 memdc.DeleteDC(); //复制临时画布到预览窗⼝43 bitmap.DeleteObject(); //删除图⽚44 ReleaseDC(pDC);45 CDialog::OnTimer(nIDEvent);46 }3.设置时钟位图打开“资源视图”在“资源视图”中添加资源资源类型选择“Bitmap",然后选择”导⼊”,把实现准备好的BMP⽂件导⼊。
【图形时钟c语言vc6.0】c语言,,,,,图形模拟时钟

【图形时钟c语言vc6.0】c语言,,,,,图形模拟时钟c语言图形模拟时钟20XX-20XX学年第二学期《高级语言程序设计》课程设计报告题目:图形模拟时钟专业:计算机科学与技术班级:14级(2)班姓名:王欣指导教师:陈广宏成绩:计算机学院20XX年5月20日目录1设计内容及要求 (2)1.1设计要求 (2)1.2程序结构流程图 (2)2概要设计 (4)2.1概要分析 (4)2.2数据结构设计.............................(). (6)2.3用法说明 (6)2.4实验结果要求 (7)3设计结果与分析 (7)3.1实验结果 (7)3.2实验结果与分析 (7)4小结 (8)致谢 (8)参考文献 (8)源代码 (9)1设计内容及要求1.1设计要求模拟机械钟表行走;要准确地利用数字显示日期和时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致;按任意键时程序退出。
在屏幕上显示一个图形时钟(用程序绘制一个班于时钟样式相似即可),时间与系统时间一致,且要随着时间的走到准确的走动。
1.2程序结构流程图图1:总程序流程图2:指针转动流程图2概要设计2.1概要分析(1)voiddrawclock函数voiddrawclock(intx,inty,intcolor){intr=150;floatth;setcolor(color);circle(x,y,r);circle(x,y,2);}作用:画表盘(r为表盘的半径,x,y为圆心的坐标。
)(2)voiddrawHand函数voiddrawHand(intx,inty,floatth,intl,intcolor){intx1,y1;x1=x+l*sin(th);y1=y-l*cos(th);setcolor(color);line(x,y,x1,y1);}作用:画指针x:直线起点的横坐标y:直线起点的纵坐标x1:直线终点的横坐标y1:直线终点的纵坐标(3)voidmain()函数Part①:intgdriver=dETEcT,gmode;structtimecurtime;..............类型和最高分辨率floatth_hour,th_min,th_sec; initgraph(&gdriver,&gmode,”“);下页c语言图形模拟时钟Graphdriver---配适器graphmode---显示模式Part②:setbkcolor(0); ....................背景色Part③:while(!kbhit()){drawclock(x0,y0,14); ..................函数()gettime(&curtime);.........得到当前系统时间gotoxy(35,20);...............定位输出位置Part④:if((float)curtime.ti_hourif((float)curtime.ti_hourprintf(“%.0f:”,(float)curti me.ti_hour);}...........输出小时else............下午的时间处理{printf(“Pm”);if((float)curtime.ti_hour-12printf(“%.0f:”,(float)curtime.ti_hour-12); }..........输出小时Part⑤:if((fl oat)curtime.ti_minprintf(“%.0f:”,(float)curtime.ti_min); .......输出分钟(同part④)if((float)curtime.ti_secprintf(“%.0f”,(float)curtime.ti_sec);Part⑥:以下三行计算表针转动角度,以竖直向上为起点,顺时针为正th_sec=(float)curtime.ti_sec*0.1047197551;-------------*(2π/60=0.1047197551)th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0;th_hour=(float)curtime.ti_hour*0.523598775+th_min/12.0;----*(2π/12=0.5235987755)Part⑦:drawHand(x0,y0,th_hour,70,2); ...................画时针drawHand(x0,y0,th_min,110,3); ...................画秒针Part⑧:settextstyle(2,0,3);..............设置字体2:文字的字体;0:文字的方向;3:文字的大小outtextxy(270,160,”madEBY:Sdw”);.............输出字体(270,160)为字体的坐标Part⑨:sleep(1);...........延时一秒后刷新cleardevice();.............清除图形屏幕closegraph().......关闭图形系统,退出图形方式2.2数据结构设计1)是对时钟程序做全面的分析,即对程序要使用的编写方法功能,运行方式进行分析,并做出正确的解决方案。
vc++课程设计---指针型时钟

VC++程序设计报告
2)添加好的结果如图:
3)对话框的 OK 按钮响应函数,使得程序提取到闹钟的三个参数, 并且启动定时器 2 void CMainFrame::OnNaozhong() {
// TODO: Add your command handler code here naozhong dlg; if(dlg.DoModal()==IDOK) {
5
VC++程序设计报告
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++) {
五、 整体设计流程图
主框架窗口
万年历
六、 数据描述 1、 静态数据 表盘的绘制、表盘的刻度
闹钟
2
VC++程序设计报告
2、 动态数据 闹钟的时、分、秒数据的输入;当前时刻表盘时分秒针运 行的数据。
七、 用户界面
八、 程序设计框架及步骤 1、打开 VC++6.0,新建一个 MFC AppWizard(exe),工程名称为
second=dlg.second; minute=dlg.minute; hour=dlg.hour; } SetTimer(2,500,NULL);
CFirstDlg dlg;//定义对话框类对象 dlg.DoModal();//显示对话框 } 8)在 OnTestDlg 函数的实现文件 MainFrm.cpp 的前面添加 CFirstDlg 类包含语句,即 #include "MainFrm.h" #include "FirstDlg.h" 7、闹钟功能的实现 1)在闹钟对话框中添加三个组合框,分别是时、分、秒。在属性中 的数据项目中添加应该显示的数据。如下图:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
案例五模拟时钟应用程序以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个模拟时钟程序,此程序在屏幕左边有一个指针式钟面,右方有两个矩形框,上面以数字方式显示日期和时间,该时间应与指针显示的时间一致,下方的矩形框作为秒表。
用菜单选项或按钮设置时间和秒表。
时间不必与机器系统时间相同,可任意设置。
模拟时钟示意图1 编程要求(1)为该程序设计一个美观大方的图标。
(2)程序界面设计合理,色彩得体大方,显示正确。
(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。
(4)各指针运动规律正确。
为便于演示,时钟速度应比实际时间快20倍,即1小时相当于3分钟。
(5)数字式时钟的时间显示与指针式时钟显示一致。
(6)按下设置时间按钮或菜单项可弹出一对话框,用于设置当前的时间和日期。
(7)按下秒表控制按钮后,秒表显示窗中显示从0开始的时间,单位为百分之一秒。
再次按下秒表控制按钮后计时停止,该窗口显示累计时间。
2 问题分析本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、定时器消息、鼠标消息、菜单命令、对话框、画笔/画刷、显示文字等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。
若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。
采用一个定时器消息可以很容易实现指针联动算法。
由于屏幕的重绘速度很快(50 ms一次),如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针;如果指针没有动,则直接绘制指针。
另外,秒表需要采用单独的定时器消息控制。
3 实现步骤(1)用AppWizard生成一个名为Clock的单文档(SDI)程序框架。
为了简化应用程序,在第四步时去掉Docking toolbar和Initial status bar选择项,其他各选项均可用缺省设置。
(2)编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。
在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。
并在菜单属性项中设定“启动时钟”菜单的ID标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“时间设置”菜单的ID标号为ID_SETTIME。
为了简化菜单,可删除系统原有的“文件”、“编辑”菜单项。
(3)利用ClassWizard为视图类添加菜单命令处理函数。
进入ClassWizard的Message Maps选项卡,选择Class Name项为CClockView 类,在Object IDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下Add Function按钮添加成员函数。
ClassWizard会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart ( )、OnStop ( )和OnSettime ( )。
(4)利用ClassWizard为视图类添加定时器和鼠标消息处理函数。
进入ClassWizard的Message Maps选项卡,选择Class Name项为CClockView类,在Messages列表框中分别选择定时器消息WM_TIMER 和鼠标消息WM_LBUTIONDOWN,按下Add Function按钮添加成员函数。
ClassWizard会添加相应的定时器和鼠标消息响应函数OnTimer和OnLButtonDown。
(5)使用Developer Studio菜单的Insert / Resource…选项调出Insert Source对话框,为项目添加新的对话框资源。
在对话框属性中,修改对话框名为“时间设定”。
在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件,如下图所示。
对话框通过控件属性,将年、月、日、时、分、秒等编辑控件的ID改为IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE 和IDC_SECOND。
(6)设计好这个对话框模板后,利用ClassWizard自动建立对话框类。
进入ClassWizard后,它会发现已建立的对话框模板资源,并弹出一个对话框询问是否要为该对话框模板建立类。
按下“OK”按钮,会弹出New Class对话框,在Name栏填写对话框类的名称CSetTimeDlg 后按“OK”按钮,即可为对话框创建一个对应的类。
(7)利用ClassWizard为对话框类添加与各控件对应的数据成员。
选择MemberVariables选项卡,确保Class Name项为对话框CSetTimeDlg 类,然后在选项卡下方的窗口中选择各控件的ID并按下“Add Variable…”按钮,为其添加对应成员变量,如表11.4所示。
表11.4 编辑控件属性最后一列为变量取值范围。
(8)编辑工程的图标资源,在Resource View选项窗口中修改Icon 结点所包含的主框架图标(IDR_MAINFRAME),修改标准图标(32像素×32像素)及小图标(16像素×16像素),从而为该程序设计一个美观大方的图标。
(9)完成以上工作后,即可修改程序框架,添加必要的代码。
4 程序清单按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。
(1) 添加表示年、月、日、时、分、秒的变量。
int year;int month;int day;int hour;int minute;int second;(2) 添加秒表的计数变量。
int watch;(3) 添加时钟的画笔及画刷变量。
CPen m_HouPen, m_MinPen, m_SecPen; // 各种针的画笔CBrush m_MarkBrush; // 表盘标记的画刷(4) 添加时钟控制变量。
CPoint m_Center; // 表的中心double m_Radius; // 表的半径CPoint m_Hour [2], m_OldHour [2]; // 时针当前及前一次位置CPoint m_Minute [2], m_OldMin [2]; // 分针当前及前一次位置CPoint m_Second [2], m_OldSec [2]; // 秒针当前及前一次位置(5) 添加秒表的两个按钮位置变量。
CRect m_WatchStart;CRect m_WatchStop;(6) 添加两个函数,计算时钟各指针位置。
void SetClock (int hour, int minute, int second);CPoint GetPoint (int nLenth, int nValue);(7) 在视图类构造函数中增加初始化语句:然后添加下列代码:绘制表盘上的标记、时针、分针和秒针,并显示数字时钟及秒表:在OnDraw函数中添加下面代码:// 用白色覆盖原位置时针请注意将表示时间的整数转换为CString字符串类型的方法以及秒表的显示方法。
另外,watch计数器以1/100秒为计数单位,每达到100则秒数加1。
u 按照下列步骤增加时钟控制代码:①修改Onstart和OnStop函数,设置时钟运动消息。
按比正常时钟快20倍的假定,50ms产生一个消息。
其代码为:②修改OnTimer函数,正确计算并处理年、月、日、时、分、秒等变量的联动变化,其代码为:③添加时间设置对话框代码。
首先在ClockView. cpp文件头部添加下列语句:#include “SetTimeDlg. H”在时间设定对话框类的构造函数中,做如下修改,将初始日期设为2010-7-10:最后,在OnSettime函数中添加代码如下:至此,除秒表外,时钟部分程序设计完成。
u 按以下步骤设计秒表控制程序:在OnLButtonDown函数中增加下列内容,以便响应单击秒表启动、停止框所发出的消息:程序运行:下图显示了模拟时钟运行的情况。
“启动”和“停止”框控制秒表,时钟用菜单控制。
本题采用标准的SDI程序结构,完全利用视图类实现了这一程序。
利用定时器消息控制时钟运动是本程序的出发点。
利用一个定时器控制时钟,易于实现指针联动规律。
计算指针位置利用了坐标变换和三角函数的知识。
本程序一个较难处理的地方是屏幕重绘,由于完全在OnDraw 函数中实现,因此限制较多。
本程序采取了先覆盖,再重绘的方法。
模拟时钟示意图本程序由于完全在OnDraw函数中实现,因此屏幕重绘较为麻烦。
如果在OnDarw函数中采用“异或”屏幕重绘方式,在程序窗口最大、最小化及移出屏幕时,会显示异常。
解决这一问题较理想的方式是在定时器处理函数OnTimer中采用“异或”方式直接重绘屏幕,而不采用调用Invalidate ( )函数的方式;同时在OnDraw函数中显示指针的最后状态,以便处理程序窗口最大、最小化及移出屏幕的情况。
在OnTimer 函数中直接重绘屏幕需要使用OClientDC类,具体用法与OnDraw函数中的pDC对象基本一致。
另外,本程序的数字时钟没有显示星期和农历,读者可尝试添加进去。