#include<stdio.h>
#include<iostream>
#include<math.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<WINDOWS.H>
#define UP 38
#define DOWN 40
#define ESC 27
#define TAB 9
#define PI 3.1415926
double h,m,s;
double x,x1,x2,y,W,y2;
char ch1;
using namespace std;
void timeupchange(int);
void timedownchange(int);
int digithour(double);
int digitmin(double);
int digitsec(double);
void digitclock(int,int,int);
void clearcursor(int);
void drawcursor(int);
void clockhandle();
struct ti
{
int ti_min;
int ti_hour;
int ti_sec;
}t[1],a;
void main()
{
int i,j;
initgraph(640,480);
line(82,430,558,430);
line(70,62,70,418);
line(82,50,558,50);
line(570,62,570,418);
line(70,62,570,62);
line(310,48,310,35);
outtextxy(290,18,"CLOCK");
arc(70,50,94,74,89,179);
arc(550,50,570,74,0,90);
setcolor(0xC0C0C0);
rectangle(270,15,350,35);
setcolor(0x800080);
rectangle(270,350,350,370);
setcolor(0xFCFCFC);
for(i=290;i<=335;i+=39)
for(j=317;j<=324;j+=7)
{
circle(i,j,1);
}
for(i=0,m=0.0,h=0.0;i<=11;i++,h++)
{
x=100*sin((h*60+m)/360*PI)+310;
y=200-100*cos((h*60+m)/360*PI);
circle(x,y,1);
}//时钟圆点
for(i=0,m=0.0;i<=59;m++,i++)
{
x=100*sin(m/30*PI)+310;
y=200-100*cos(m/30*PI);
circle(x,y,1);
}
//分针圆点
setlinestyle(PS_DASHDOT);
line(70,418,82,430);
setlinestyle(PS_DASHDOT);
line(570,418,558,430);
setcolor(0xFCFCFC);
outtextxy(120,340,"Tab :Cursor move");
outtextxy(120,370,"Up :Time + +");
outtextxy(370,340,"Down:Time - -");
outtextxy(370,370,"Esc :Quit system!");
outtextxy(292,352,"HELP");
settextstyle(15,0,_T("宋体"));
outtextxy(100,110,_T("write it on"));
outtextxy(100,140,_T("your heart"));
outtextxy(100,170,_T("that every"));
outtextxy(100,200,_T("day is the"));
outtextxy(100,230,_T("best of "));
outtextxy(100,260,_T("the year."));
outtextxy(450,140,_T("铭记在心:"));
outtextxy(450,170,_T("每一天都是"));
outtextxy(450,200,_T("一年中最好"));
outtextxy(450,230,_T("的日子。"));
for( i=0;i<12;i++)
{
x=310+(int)(105*sin(30*i*2*PI/360));
y=200-(int)(105*cos(30*i*2*PI/360));
switch(i)
{
case 0:outtextxy(x-5,y-5,"12");break;
case 1:outtextxy(x-5,y-5,"1");break;
case 2:outtextxy(x-5,y-5,"2");break;
case 3:outtextxy(x-5,y-5,"3");break;
case 4:outtextxy(x-5,y-5,"4");break;
case 5:outtextxy(x-5,y-5,"5");break;
case 6:outtextxy(x-5,y-5,"6");break;
case 7:outtextxy(x-5,y-5,"7");break;
case 8:outtextxy(x-5,y-5,"8");break;
case 9:outtextxy(x-5,y-5,"9");break;
case 10:outtextxy(x-5,y-5,"10");break;
case 11:outtextxy(x-5,y-5,"11");break;
}
}
int a,b,a1,b1,n=0;
for(n=0;n<60;n++)
{
a=310+(int)(95 * sin(n*2*PI/60));
b=200-(int)(95 * cos(n*2*PI/60));
a1=310+(int)(85 * sin(n*2*PI/60));
b1=200-(int)(85 * cos(n*2*PI/60));
if(n%5==0)
setlinestyle(PS_DASHDOT);
else
setlinestyle(PS_DASHDOT);
line(a1,b1,a,b);
}
clockhandle();
getch();
closegraph();
}
void clockhandle()
{
SYSTEMTIME xx;
// 定义变量保存当前时间
GetLocalTime(&xx);
t[0].ti_hour=xx.wHour;
t[0].ti_min=xx.wMinute;
t[0].ti_sec=xx.wSecond;
//设置当前系统时
int k=0,count;
h=t[0].ti_hour;
m=t[0].ti_min;
s=t[0].ti_sec;
x=50*sin((h*60+m)/360*PI)+310; /*时针的x座标*/
y=200-50*cos((h*60+m)/360*PI);/*时针的y座标*/
setcolor(0xFCFCFC);
line(310,200,x,y); /*绘制时针*/
x1=80*sin(m/30*PI)+310;/*分针的x座标*/
W=200-80*cos(m/30*PI);/*分针的y座标*/
line(310,200,x1,W);/*绘制分针*/
digitclock(260,314,digithour(h));/*显示小时值*/
digitclock(308,314,digitmin(m)); /*显示分钟值*/
// 定义变量保存当前时间
setwritemode(R2_XORPEN); // 设置 XOR 绘图模式
char ch;
for( count=2;ch!=27;)/*按下Esc键结束循环*/
{
if(kbhit())
ch=getch();
setcolor(0x0000A8);
h=t[0].ti_hour;
m=t[0].ti_min;
s=t[0].ti_sec;
x2=98*sin(s/30*PI)+310;/*秒针的x座标值*/
y2=200-98*cos(s/30*PI);/*秒针的y座标值*/
line(310,200,x2,y2);/*绘制秒针*/
Sleep(1000);
SYSTEMTIME yy;
// 定义变量保存当前时间
GetLocalTime(&yy);
t[0].ti_hour=yy.wHour;
t[0].ti_min=yy.wMinute;
t[0].ti_sec=yy.wSecond;
while(t[0].ti_sec==s&&t[0].ti_min==m&&t[0].ti_hour==h)
{
ch1=getch();
if(kbhit())//如果有按键值则执行if语句
{
while(ch1!=27)//用ch=_getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。
{
if(ch1==38)
{
if(count==1)
{
t[0].ti_hour++;
if( t[0].ti_hour==24) t[0].ti_hour=0;
}
if(count==2)
{
t[0].ti_min++;
if(t[0].ti_min==60) t[0].ti_min=0;
//设置新的系统时间
}
if(count==3)
{
t[0].ti_sec++;
if(t[0].ti_sec==60) t[0].ti_sec=0;
//设置新的系统时间
}
}
if(ch1==40)
{
if(count==1)
{
t[0].ti_hour--;
if(t[0].ti_hour==0) t[0].ti_hour=23;
//设置新的系统时间
}
if(count==2)
{
t[0].ti_min--;
if(t[0].ti_min==0) t[0].ti_min=59;
//设置新的系统时间
}
if(count==3)
{
t[0].ti_sec--;
if(t[0].ti_sec==0) t[0].ti_sec=59;
//设置新的系统时间
}
}
if(ch1==9)
{
setcolor(0xFCFCFC);clearcursor(count);
setcolor(0);drawcursor(count);
count++;
}
if(count==5)count=1;
}
}
}
setcolor(0);
digitclock(340,314,digitsec(s));
setcolor(0xFCFCFC);
digitclock(340,314,digitsec(s)+1);/*数字时针增加1秒*/
setcolor(0x0000A8);
x2=98*sin(s/30*PI)+310;
y2=200-98*cos(s/30*PI);
line(310,200,x2,y2);/*在原来的地方绘制秒针,清除当前秒针*/
if(t[0].ti_min!=m)/*若分针有变化,则清除当前分针*/
{
setcolor(0xFCFCFC);
x1=80*sin(m/30*PI)+310;
W=200-80*cos(m/30*PI);
line(310,200,x1,W);/*绘制新的分针*/
setcolor(BLACK);
digitclock(308,314,digitmin(m));
m=t[0].ti_min;
setcolor(0xFCFCFC);
digitclock(308,314,digitmin(m));//显示数字分
x1=80*sin(m/30*PI)+310;
W=200-80*cos(m/30*PI);
line(310,200,x1,W);
}
if((t[0].ti_hour*60+t[0].ti_min)!=(h*60+m))
{
setcolor(0xFCFCFC);
x=50*sin((h*60+m)/360*PI)+310;
y=200-50*cos((h*60+m)/360*PI);
line(310,200,x,y);/*绘制新的时针*/
setcolor(BLACK);
digitclock(260,314,digithour(h));
h=t[0].ti_hour;
setcolor(0xFCFCFC);
digitclock(260,314,digithour(h));//数字
x=50*sin((h*60+m)/360*PI)+310;
y=200-50*cos((h*60+m)/360*PI);
line(310,200,x,y);
}
}
}
void timeupchange(int count)//处理光标上移的按键
{
if(count==1)
{
t[0].ti_hour++;
if( t[0].ti_hour==24) t[0].ti_hour=0;
}
if(count==2)
{
t[0].ti_min++;
if(t[0].ti_min==60) t[0].ti_min=0;
//设置新的系统时间
}
if(count==3)
{
t[0].ti_sec++;
if(t[0].ti_sec==60) t[0].ti_sec=0;
//设置新的系统时间
}
}
void timedownchange(int count) //处理光标下移的按键
{
if(count==1)
{
t[0].ti_hour--;
if(t[0].ti_hour==0) t[0].ti_hour=23;
//设置新的系统时间
}
if(count==2)
{
t[0].ti_min--;
if(t[0].ti_min==0) t[0].ti_min=59;
//设置新的系统时间
}
if(count==3)
{
t[0].ti_sec--;
if(t[0].ti_sec==0) t[0].ti_sec=59;
//设置新的系统时间
}
}
void digitclock(int x,int y,int clock)//在指定位置显示数字时钟
{
char buffer1[3]="";
if(clock==60) clock=0;
sprintf( buffer1,"%d",clock);//文件方式
outtextxy(x,y,buffer1); //文字输出
}
int digithour(double h)//将double型的小时数换成int型
{
int i;
for(i=0;i<24;i++)
{
if(h==i) return i;
}
}
int digitmin(double m)
{
int i;
for(i=0;i<60;i++)
{
if(m==i) return i;
}
}
int digitsec(double s)
{
int i;
for(i=0;i<60;i++)
{
if(s==i) return i;
}
}
void drawcursor(int count)//根据count的值,画一个光标
{
switch(count)
{
case 1:setcolor(0xFCFCFC);line(284,315,284,325);break;
case 2:setcolor(0xFCFCFC);line(325,315,325,325);break;
case 3:setcolor(0xFCFCFC);line(365,315,365,325);break;
}
}
void clearcursor(int count)//根据count的值,清除一个光标
{
switch(count)
{
case 1:setcolor(BLACK);line(284,315,284,325);break;
case 2:setcolor(BLACK);line(325,315,325,325);break;
case 3:setcolor(BLACK);line(365,315,365,325);break;
}
}
学C语言半个学期,和同学一起做的课程设计,还有很多bug,但值得记录第一次。