#include<windows.h>
#include <stdio.h>
#include <graphics.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <string.h>
#include <conio.h>
#define pai 3.1415926
#define aha ((2*pai)/60)
#define len_sz 60 /*时针长度*/
#define len_fz 120 /*分针长度*/
#define len_mz 150 /*秒针长度*/
#define in_c (len_mz+15) /*面板内圆半径*/
#define out_c (in_c+16) /*面板外圆半径*/
#define zhendian (int)(in_c+out_c)/2 /*面板整点圆半径*/
#define frame_r (out_c+10) /*面板框半径即边长的一半*/
struct coordinate /*时针、分针、秒针、整点位置坐标数组*/
{
int x,y;
}sz_zb[60],fz_zb[60],mz_zb[60],zhen_dian[60];
int frame_left,frame_top,frame_right,frame_bottom;
int cx,cy; /*圆心坐标*/
int sys_s,sys_f,sys_m; /*系统时钟、分钟、秒钟的值*/
void jszb() /*坐标点计算*/
{float a=0;
int i;
struct cood{int x,y;} sz[60],fz[60],mz[60]; /*定义临时坐标数组变量*/
cx=getmaxx()/2; /*计算圆心坐标*/
cy=getmaxy()/2;
for(i=0;i<60;i++)
{sz[i].x=cx+(int)(len_sz*cos(a)); /*计算时针坐标*/
sz[i].y=cy-(int)(len_sz*sin(a));
fz[i].x=cx+(int)(len_fz*cos(a)); /*计算分针坐标*/
fz[i].y=cy-(int)(len_fz*sin(a));
mz[i].x=cx+(int)(len_mz*cos(a)); /*计算秒针坐标*/
mz[i].y=cy-(int)(len_mz*sin(a));
zhen_dian[i].x=cx+(int)(zhendian*sin(a)); /*计算整点位置坐标*/
zhen_dian[i].y=cy-(int)(zhendian*cos(a));
a=a+aha; /*修改角度*/
}
for(i=0;i<15;i++) /*处理第一象限的坐标*/
{sz_zb[i].x=sz[14-i].x;sz_zb[i].y=sz[14-i].y;
fz_zb[i].x=fz[14-i].x;fz_zb[i].y=fz[14-i].y;
mz_zb[i].x=mz[14-i].x;mz_zb[i].y=mz[14-i].y;
}
for(i=0;i<45;i++) /*处理第四、第三、第二象限的坐标*/
{sz_zb[i+15].x=sz[59-i].x;sz_zb[i+15].y=sz[59-i].y;
fz_zb[i+15].x=fz[59-i].x;fz_zb[i+15].y=fz[59-i].y;
mz_zb[i+15].x=mz[59-i].x;mz_zb[i+15].y=mz[59-i].y;
}
frame_left=cx-frame_r; /*表面板框的左上角和右下角坐标*/
frame_top=cy-frame_r;
frame_right=cx+frame_r;
frame_bottom=cy+frame_r;
}
void panel() /*绘制时钟面板*/
{int i,oldcolor;
//char dat[128];
//_strdate(dat);
time_t ltime;
time( <ime );
setbkcolor(BLACK);
setcolor(GREEN);
rectangle(frame_left,frame_top,frame_right,frame_bottom+50); /*方框*/
setfillstyle(1,WHITE);
floodfill(frame_left+1,frame_top+1,RED);
rectangle(frame_left,frame_top-50,frame_right,frame_top); /*标题框*/
setfillstyle(1,GREEN);
floodfill(frame_left+1,frame_top-25+1,RED);
setcolor(WHITE);
outtextxy(frame_left+10,frame_top-10,"Made by 毕建华"); /*标题框中的文字*/
//printf("Today is:%s\n",dat);
//outtextxy(frame_bottom-100,frame_top-10,dat);
outtextxy(frame_bottom-100,frame_top-10,ctime( <ime));
printf("The time is %30.10s\n", ctime( <ime ) );
setcolor(BLUE);
circle(cx,cy,in_c); /*面板中的内圆*/
circle(cx,cy,out_c); /*面板中的外圆*/
for(i=0;i<60;i++)
{if(i%5!=0) putpixel(zhen_dian[i].x,zhen_dian[i].y,5); /*标志点*/
else /*整点位置的标志*/
{oldcolor=getcolor();
setcolor(5);
setfillstyle(1,5);
circle(zhen_dian[i].x,zhen_dian[i].y,3); /*12个整点位置画半径为3的圆*/
floodfill(zhen_dian[i].x,zhen_dian[i].y,5); /*对半径为3的圆进行填充*/
setcolor(oldcolor);
}
}
}
void get_time() /*从系统获取时间*/
{time_t lt;;
struct tm *tmt;
lt=time(NULL);
tmt=localtime(<);
sys_s=tmt->tm_hour;
sys_f=tmt->tm_min;
sys_m=tmt->tm_sec;
}
void init() /*初始化模块*/
{int gd=DETECT,gm;
initgraph(&gd,&gm,"");
cleardevice();
}
void clkrun(int flag) /*运行时钟*/
{static int s=0,f=0,m=0; /*时间计数器初始化*/
int sb;
int i,freq=900;
int time=500;
if(flag)
s=sys_s,f=sys_f,m=sys_m; /*以系统时间作为初始值*/
setfillstyle(1,WHITE); /*设置填充风格和颜色*/
setcolor(WHITE); /*设置画图颜色*/
circle(cx,cy,len_mz+3); /*画一个圆*/
floodfill(cx,cy,1); /*对画的圆进行填充,实现三个指针的擦除*/
setcolor(BLACK); /*设置重新画线颜色*/
setlinestyle(0,0,1); /*设置画线的风格及线宽*/
line(cx,cy,mz_zb[m].x,mz_zb[m].y); /*画当前秒针*/
setlinestyle(0,1,3); /*设置重新画线颜色*/
line(cx,cy,fz_zb[f].x,fz_zb[f].y); /*画当前分针*/
s=s%12; /*时钟的值为0-11*/
sb=s*5+f/12; /*当前时针的实际坐标位置*/
line(cx,cy,sz_zb[sb].x,sz_zb[sb].y); /*画当前时针*/
Sleep(1200); /*延时*/
m++; /*修改秒钟的值*/
if(m==60)
{m=0;f++; /*秒钟置0,分钟增1*/
if(f==60)
{f=0;s++; /*分钟置0,时钟增1*/
if (s)
Beep(freq,time);
if(s==12)
s=0;
//if (s==2)
//ExitWindows(0,0); /*自动关机函数*/
/*整点报时*/
}
}
}
void main() /*主函数*/
{int flag=1;
init();
jszb();
panel();
get_time();
while(1)
{clkrun(flag);
flag=0;
//if(bioskey(1)) exit(1);
}
}
评论1