一种新的多时区时钟软件的设计与实现

时间:2022-04-22 05:40:02

一种新的多时区时钟软件的设计与实现

摘要:本文采用VC++6.0编译器,运用API函数及类库设计与实现了一个多时区的时钟软件。该软件通过对菜单中时区的选择来切换不同时区时钟的显示,利用API计时器函数,实现了计时和时钟的每秒刷新,同时利用MFC类库函数对表盘和时钟指针进行了颜色设置,使得时钟在完成计时和日期显示功能的同时,界面更加美观。

关键词:Visual C++;时钟软件;API函数

中图分类号:TP273 文献标识码:A文章编号:1007-9599 (2011) 12-0000-02

A New Multi Time Zones Clock Software Design and Implementation

Zhang Ruijuan1,Zhang Hongbing2,Yang Jie1

(1.Huaiyin Teachers College,School of Mathematical Sciences,Huaian223300,China;2.Jiangsu Auto Electric Co.,Ltd.,Huaian223305,China)

Abstract:A new clock is designed and realized with Visual C++6.0 and API in this paper.The clock software displays time of different zones through menu selection.This software realizes timing and clock’s refresh per second with API timer function.Meanwhile,the color for dial and clock hands is set with MFC functions,so that it can display time and date and its interface is more beautiful.

Keywords:Visual C++;Clock software;API functions

一、引言

随着现代社会发展,电脑进入千家万户,人们已经习惯用互联网的方式学习,交流,娱乐。由于网上跨国交流也越来越频繁,但是由于时间差的关系,人们浏览国外新闻时常要进行时间的换算。不同地区时间的不同也影响到人们的交流。因此,一种可以显示很多个时区时间的时钟软件,将给人们的生活和交流带来很大地方便。

本文使用VC++6.0编译器,使用API函数和C库函数,完全从代码的层面设计与实现了一个多时区时钟软件。

二、程序功能描述

该软件主要实现三个功能:时钟显示,菜单实现与日期的显示,通过对File菜单的选择来创建一个或者多个时钟窗口,在创建File菜单的同时,本软件也添加了选择时区的菜单项和对时钟窗口进行管理的菜单项,其中对窗口管理的菜单项有层叠、平铺、排列图标等。在程序的时钟窗口上,有一个日历,一个随机颜色指针式的时钟。该多时区时钟软件显示四个时区时间效果,如图1所示。

图1.多时区时钟软件效果图

三、多时区时钟软件设计思想

(一)窗口界面中关于日期菜单的创建

为了更方便的正确知道时间,本文使用标签将日期、时间及时区显示出来。本文使用如下的for循环来创建对应日期、时间及时区的标签。

for(i=0;i

pZone Data->hwnd Label[i]=Create Window(TEXT("static"),sz Color Label[i],

WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+4),hInstance,NULL);

P Zone Data->hwnd Value[i]=Create Window(TEXT("static"),TEXT("0"),

WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+7),h Instance,NULL);

}

P Zone Data->hwnd Zone=Create Window(TEXT("static"),TEXT("淮安时间"),

WS_CHILD|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)10,hInstance,NULL);

由于创建标签后会携带一个包含标签的矩形框,该矩形框覆盖掉了背景颜色,故必须对之处理以擦除该矩形框来美化界面,本文使用Get Window Long函数取得它的标识,然后调用Set Text Color函数把标签的字体颜色设置为红色,并调用Set Bk Color函数来擦除该标签的背景颜色。为了能够让时钟显示不同时区的时间,本文为窗口添加了一个菜单,这个菜单是在编译器自带的菜单基础上创建的。菜单效果如图2所示。

图2.时钟软件菜单

其中通过选择East和West的下拉菜单,可以设置显示不同时区的时间和日期。

为了在其他的消息中,对时钟指针每秒对应时间的改变做出正确的反应,本文使用计时器函数Set Timer。为了从图2中选择不同的菜单标签,让程序做出显示不同时区时间的功能,本文为东1区到东12区,零时区,西1区到西12区分别做出不同的标识,如IDM_EAST_ONE、IDM_EAST_TWO、case IDM_WEST_ONE、case IDM_EAST_ZERO等。

为了使窗口上面的日期和时间等7个标签,摆放在正确的位置,本文使用Move Window函数来完成该操作,效果如图3。

图3.标签位置效果图

(二)时钟指针与表盘的绘制

绘制时钟时使用Get Local Time函数来取得当地时间,绘制表盘本文自定义了函数Draw Clock,部分代码如下:

void Draw Clock(HDC hdc){

for(iAngle=0;iAngle

pt[0].x=0;/*初始化x坐标*/

pt[0].y=900;/*初始化y坐标*/

Rotate Point(pt,1,iAngle);/*调用画时钟圆点的函数*/

pt[2].x=pt[2].y=iAngle%5?33:100;/*判断分钟是否是5的倍数*/

pt[0].x-=pt[2].x/2;/*以下四行为坐标变换*/

pt[0].y-=pt[2].y/2;

pt[1].x=pt[0].x+pt[2].x;

pt[1].y=pt[0].y+pt[2].y;

h Brush=Create Solid Brush(RGB(255,255,0));/*创建画刷*/

Select Object(hdc,h Brush);/*把画刷选入设备环境*/

Ellipse(hdc,pt[0].x,pt[0].y,pt[1].x,pt[1].y);/*画椭圆*/

Delete Object(h Brush);/*删除画刷*/

}

}

在该函数中,pt[0].x、pt[1].x和pt[2].x分别表示时钟秒针、分针和时针的x坐标点,pt[0].y、pt[1].y和pt[2].y分别表示时钟秒针、分针和时针的y坐标点。在DrawClock函数中又调用了自定义函数Rotate Point来实现对应时钟指针每秒坐标位置的变化,代码如下:

void Rotate Point(POINT pt[],int iNum,int iAngle){

for(i=0;i

/*以下两行分别为时钟指针x和y坐标的角度换算*/

ptTemp.x=(int)(pt[i].x*cos(TWOPI*iAngle/360)+pt[i].y*sin(TWOPI*iAngle/360));

ptTemp.y=(int)(pt[i].y*cos(TWOPI*iAngle/360)-pt[i].x*sin(TWOPI*iAngle/360));

pt[i]=ptTemp;

}

}

针对时钟指针的绘制,本文自定义了一个函数Draw Hands,部分代码如下:

void Draw Hands(HDC hdc,SYSTEMTIME*pst){

static POINT pt[3][7]

={0,-150,0,450,-25,450,-25,500,25,500,25,450,0,450,0,-200,0,650,-25,650,0,700,25,650,0,650,0,650,0,0,0,650,-50,700,0,800,50,700,0,650,0,650};/*初始化时钟指针坐标*/

inti,iAngle[3];

POINT ptTemp[3][7];

/*以下三行分别计算时针、分针和秒针位置角度*/

pZoneData->iAngle[0]=(pst->wHour*30)%360+pst->wMinute/2;

pZoneData->iAngle[1]=pst->wMinute*6;

pZoneData->iAngle[2]=pst->wSecond*6;

memcpy(ptTemp,pt,sizeof(pt));

for(i=0;i

{

Rotate Point(ptTemp[i],7,iAngle[i]);/*画时针圆点*/

Polyline(hdc,ptTemp[i],7);/*画时钟指针*/

}

}

pt是一个3×7的2维数组,初始化时钟的时针分钟秒针,都在12点的位置绘制坐标,Poly line函数是把pt数组中表示的坐标点用直线连接起来的API函数。为了减少内存开销及提高程序的效率,避免对不必要的窗口客户区进行重新绘制,需记录前一秒时钟指针的位置,本文用与窗口客户区相同的背景颜色RGB(0,0,0)黑色作为画刷,同样调用Draw Hands函数对前一秒位置进行覆盖。

(三)关于窗口菜单的消息处理

本文利用标签IDM_FILE_NEWCLOCK来创建一个新时钟new clock,并对时钟窗口进行位置和高宽度及样式等的设置。利用Send Message函数分别完成关闭时钟窗口,对时钟窗口进行层叠、平铺设置及对时钟窗口最小化窗口进行最小化排列等操作。其中四个时区时钟平铺和进行最小化排列后效果如图1和4所示。

图4.四个时钟最小化效果图

四、结论

本文在VC6.0++编译环境下,给出了一种新的多时区时钟的设计与实现方法,主要通过对API函数的调用和对Windows消息响应机制的操作,实现了一个模拟现实生活中的时钟软件,并在此基础上添加了多时区的功能,以及对时间和日期的显示。最后对标签等背景颜色做出了相应的处理,以使界面更美观。

参考文献:

[1]黄维通.Visual C++面向对象与可视化程序设计[M].北京:清华大学出版社,2003

[2]郑莉,董渊.C++语言程序设计[M].北京:清华大学出版社,2001

[3]古槿.新手学Visual C++30例[M].北京:人民邮电出版社,2004

[4]Charles Petzold.Windows程序设计[M].北京:北京大学出版社,1999

[5]胡峪,刘静.Visual C++编程技巧与示例[M].西安:西安电子科技大学出版社,2000

上一篇:以金融业推动我国中小企业集合年金计划的发展 下一篇:新前场I场127#道岔30秒不停机故障的分析