c鍾表演算法
1、以下常式實現時鍾的實時顯示基本要求: 1) 自行設計界面,模擬表盤式時鍾。要求界面美觀,清晰。2)數字同步顯示時間信息。
2、常式:
#include<graphics.h>
#include<math.h>
#include<dos.h>
#definePI3.1415926
//屏幕中心的坐標(640X480模式下)
#definemid_x320
#definemid_y240
intmain()
{intgraphdriver=DETECT,graphmode;
intend_x,end_y;
structtimecurtime;
floatth_hour,th_min,th_sec;
initgraph(&graphdriver,&graphmode,"C:\TC2");//初始化VGA屏幕模式
setbkcolor(BLACK);//使用黑色的背景色
while(!kbhit(0))//若有鍵盤輸入,則跳出,即是結束程序
{setcolor(GREEN);//把畫筆設為綠色
circle(mid_x,mid_y,180);//鍾的外圓
circle(mid_x,mid_y,150);//鍾的內圓
circle(mid_x,mid_y,1);//畫出鍾的圓心
gettime(&curtime);//取得系統當前時間
th_sec=(float)curtime.ti_sec*0.1047197551;//把秒針的角度化為弧度,為以後繪制時方便,下同
th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0;//分針的弧度
th_hour=(float)curtime.ti_hour*0.5235987755+th_min/12.0;//時度的弧度,注意整時是12等分的,所時乘的是3.14/180*5
//計算出時針的尾的坐標(時針長70)
end_x=mid_x+70*sin(th_hour);
end_y=mid_y-70*cos(th_hour);
setcolor(RED);
line(mid_x,mid_y,end_x,end_y);//用紅色線畫出時針
//計算出分針坐標(分針長110)
end_x=mid_x+110*sin(th_min);
end_y=mid_y-110*cos(th_min);
setcolor(RED);
line(mid_x,mid_y,end_x,end_y);//用紅色畫出分針
end_x=mid_x+140*sin(th_sec);
end_y=mid_y-140*cos(th_sec);
setcolor(RED);
line(mid_x,mid_y,end_x,end_y);//同上,畫出秒針,長為140
//畫出鍾盤上的刻度,刻度長20
line(140,240,160,240);//9點對應的大刻度
line(320,60,320,80);//12點對應的大刻度
line(500,240,480,240);//3點的刻度
line(320,420,320,400);//6點的刻度
line(410,395.7,400,378.4);//5點
line(475.7,330,458.4,320);//4點
line(475.7,150,458.4,160);//2點
line(410,84.3,400,101.6);//1點
line(230,84.3,240,101.6);//11點
line(164.3,150,181.6,160);//10點
line(164.3,330,181.6,320);//8點
line(230,395.7,240,378.4);//7點
sleep(BLUE);//這里應該是打錯,停止一秒,應為sleep(1000)
cleardevice();//清除屏幕上的顯示
}
closegraph();//關閉VGA屏幕,即返迴文本方式
return0;
}
『貳』 誰能幫我用c語言編寫桌面鍾表啊!
#include<math.h>
#include<dos.h>
#include<graphics.h>
#define
CENTERX
320
/*表盤中心位置*/
#define
CENTERY
175
#define
CLICK
100
/*喀嗒聲頻率*/
#define
CLICKDELAY
30
/*喀嗒聲延時*/
#define
HEBEEP
10000
/*高聲頻率*/
#define
LOWBEEP
500
/*低聲頻率*/
#define
BEEPDELAY
200
/*報時聲延時*/
/*表盤刻度形狀*/
int
Mrk_1[8]={-5,-160,5,-160,5,-130,-5,-130,
};
int
Mrk_2[8]={-5,-160,5,-160,2,-130,-2-130,
};
/*時針形狀*/
int
HourHand[8]={-3,-100,3,-120,4,
10,-4,10};
/*分針形狀*/
int
MiHand[8]={-3,-120,3,-120,4,
10,-4,10};
/*秒針形狀*/
int
SecHand[8]={-2,-150,2,-150,3,
10,-3,10};
/*發出喀嗒聲*/
void
Click()
{
sound(CLICK);
delay(CLICKDELAY);
nosound();
}
/*高聲報時*/
void
HighBeep()
{
sound(HEBEEP);
delay(BEEPDELAY);
nosound;
}
/*低聲報時*/
void
LowBeep()
{
sound(LOWBEEP);
}
/*按任意角度畫多邊形*/
void
DrawPoly(int
*data,int
angle,int
color)
{
int
usedata[8];
float
sinang,cosang;
int
i;
sinang=sin((float)angle/180*3.14);
cosang=cos((float)angle/180*3.14);
for(i=0;i<8;i+=2)
{
usedata[i]
=CENTERX+
cosang*data[i]-sinang*data[i+1]+.5;
usedata[i+1]=CENTERY+sinang*data[i]+cosang*data[i+1]+.5;
}
setfillstyle(SOLID_FILL,color);
fillpoly(4,usedata);
}
/*畫表盤*/
void
DrawClock(struct
time
*cutime)
{
int
ang;
float
hourrate,minrate,secrate;
setbkcolor(BLUE);
cleardevice();
setcolor(WHITE);
/*
畫刻度*/
for(ang=0;ang<360;ang+=90)
{
DrawPoly(Mrk_1,ang,WHITE);
DrawPoly(Mrk_2,ang+30,WHITE);
DrawPoly(Mrk_2,ang+60,WHITE);
}
secrate=(float)cutime->ti_sec/60;
minrate=((float)cutime->ti_min+secrate)/60;
hourrate=(((float)cutime->ti_hour/12)+minrate)/12;
ang=hourrate*360;
DrawPoly(HourHand,ang,YELLOW);/*畫時針*/
ang=minrate*360;
DrawPoly(MiHand,ang,
GREEN);/*畫分針*/
ang=secrate*360;
DrawPoly(SecHand,ang,
RED);/*畫秒針*/
}
main()
{
int
gdriver=EGA,
gmode=EGAHI;
int
curpage;
struct
time
curtime
,newtime
;
initgraph(&gdriver,&gmode,"c:\\tc");
setbkcolor(BLUE);
cleardevice();
gettime(&curtime);
curpage=0;
DrawClock(&curtime);
while(1)
{
if(kbhit())
break;
/*按任意鍵退出*/
gettime(&newtime);
/*檢測系統時間*/
if(newtime.ti_sec!=curtime.ti_sec)/*每1秒更新一次時間*/
{
if(curpage==0)
curpage=1;
else
curpage=0;
curtime=newtime;
/*設置繪圖頁*/
setactivepage(curpage);
/*在圖頁上畫表盤*/
DrawClock(&curtime);
/*設置繪圖頁為當前可見頁*/
setvisualpage(curpage);
/*0分0秒高聲報時*/
if(newtime.ti_min==0&&newtime.ti_sec==0)
HighBeep();
/*
59分55至秒時低聲報時*/
else
if(newtime.ti_min==59&&
newtime.ti_sec<=59)
LowBeep();/*其他時間只發出喀嗒聲*/
else
Click();
}
}
closegraph();
}
『叄』 用C語言做數字時鍾每走一秒響一次,求大神告訴源代碼
「響一次」需要牽涉到圖形編程中的音樂播放問題,需要自己下載圖形編程相關庫文件,具體實現請自己在TODO里添加播放音樂的代碼
數字時鍾的實現很簡單,運用time.h相關函數即可
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
time_toldt=-1;
structtm*p;
boolPrintdate()
{
time_tt=time(NULL);
if(t!=oldt)
{
oldt=t;
p=localtime(&t);
system("cls");
printf("%d/%d/%d周",1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
switch(p->tm_wday)
{
case1:printf("一");break;
case2:printf("二");break;
case3:printf("三");break;
case4:printf("四");break;
case5:printf("五");break;
case6:printf("六");break;
case7:printf("日");break;
}
printf("%d:%02d:%02d",p->tm_hour,p->tm_min,p->tm_sec);
return1;
}
return0;
}
main()
{
while(1)
if(Printdate())
{
/*************TODO*************/
/**Forexample:printf("a");**/
}
return0;
}
『肆』 用C語言程序運行出一個鍾表 要求切身時間過得
你要給哥加分啊。。。這可視個高難度的 花了哥一個小時 首先我的聲明 1.這是用windows api寫的程序。所以要求是純c的話就沒有辦法了 2.其中定時用了兩種方法。一種是用取消息。另一種是延時隊列。這里只使用了取消息的方法。延時隊列由於我機器上是vc6.0,CreateTimerQueue在本人機器上無法使用,需要新的sdk,所以沒有加以驗證,但取消息的方式是可行的。 3.稍稍驗證了下,基本滿足要求。 ------------------------------------------- 程序如下: // DigitalClock.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> #include <winbase.h> typedef struct _st_time{ int hour; int min; int sec; }ST_TIME; ST_TIME g_Time; // The struct contain the hour,min and sec. HANDLE g_hStdout; // WORD g_cxCenter, g_cyCenter; // Center of the screen. HANDLE g_DoneEvent; // The program could be over. BOOL g_ThreadTerminated; // The Thread should be terminated. #define SECOND_CIRCLE 60 #define MINUTE_CIRCLE 60 #define HOUR_CIRCLE 24 void TimeIncreaseSecond(ST_TIME & st) { st.sec ++; if (st.sec >= SECOND_CIRCLE) { st.sec -= SECOND_CIRCLE; st.min++; if (st.min >= MINUTE_CIRCLE) { st.min -= MINUTE_CIRCLE; st.hour++; if (st.hour >= HOUR_CIRCLE) { st.hour -= HOUR_CIRCLE; } } } } void PrintTimeToScreen(HANDLE hStdout, short cxCenter, short cyCenter, ST_TIME st) { char buf[64] = {0}; COORD crdPos; // make it format to output. sprintf (buf, "%02d:%02d:%02d", st.hour, st.min, st.sec); crdPos.X = cxCenter - 4; crdPos.Y = cyCenter; SetConsoleCursorPosition(hStdout, crdPos); printf(buf); } #ifdef USE_TIMERQUEUE // if we use the timer queue function. // Its procre is in this. void CALLBACK TimerRoutine (LPVOID lpParam, BOOL TimerOrWaitFired) { if (lpParam == NULL) { printf ("NULL parameters.\n"); } else { ST_TIME *st = (ST_TIME *)lpParam; TimeIncreaseSecond(st); PrintTimeToScreen(g_hStdout, g_cxCenter, g_cyCenter, *st); } } #else DWORD WINAPI TimerThreadProc(LPVOID lpParam) { #define ID_TIMER_SECOND 1 MSG msg; BOOL ret; ST_TIME *st = (ST_TIME *)lpParam; SetTimer(NULL, ID_TIMER_SECOND, 1000, NULL); PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); while (!g_ThreadTerminated && (ret = GetMessage (&msg, NULL, 0, 0)) != 0) { if (ret == -1) { //process fatal event. } else if (msg.message == WM_TIMER) { TimeIncreaseSecond(*st); PrintTimeToScreen(g_hStdout, g_cxCenter, g_cyCenter, *st); } else { TranslateMessage (&msg); DispatchMessage (&msg); } } return 1; } #endif // If the ctrl+break combined key pressed. call this function. // It set the g_DoneEvent. this terminate the program. BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) { switch (fdwCtrlType) { case CTRL_BREAK_EVENT: // Terminate the program. printf ("Terminate.\n"); SetEvent(g_DoneEvent); return TRUE; default: return FALSE; } } BOOL InitApplication() { // Get the stdin and stdout handle. HANDLE hStdIn; hStdIn = GetStdHandle(STD_INPUT_HANDLE); if (hStdIn == INVALID_HANDLE_VALUE) return FALSE; g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE); // Set the mode, make the input echo. DWORD fOldMode; GetConsoleMode(hStdIn, &fOldMode); fOldMode |= ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT; SetConsoleMode(hStdIn, fOldMode); // Set the window buffer. // make a line 40 columns. CONSOLE_SCREEN_BUFFER_INFO csbiInfo; GetConsoleScreenBufferInfo(g_hStdout, &csbiInfo); csbiInfo.srWindow.Right = 40; // get the center point. g_cxCenter = csbiInfo.srWindow.Right / 2; g_cyCenter = csbiInfo.srWindow.Bottom / 2; // Set the window. SetConsoleWindowInfo(g_hStdout, TRUE, &csbiInfo.srWindow); return TRUE; } BOOL (HANDLE hStdout, WORD cxCenter, WORD cyCenter, ST_TIME & time) { #define GAPS_LEFT_COLON (-2) #define GAPS_RIGHT_COLON (1) #define GAPS_LEFT_UNDERLINE_START (-4) #define GAPS_MIDDLE_UNDERLINE_START (-1) #define GAPS_RIGHT_UNDERLINE_START (2) // __:__:__ // So the left ":" center -2 // so the right ":" center + 1 // so the left "_" center - 4; // so the lfet "_" center - 1; // so the right "_" center + 2; COORD crdPos; crdPos.X = cxCenter + GAPS_LEFT_COLON; crdPos.Y = cyCenter; SetConsoleCursorPosition(hStdout, crdPos); printf (":"); crdPos.X = cxCenter + GAPS_RIGHT_COLON; SetConsoleCursorPosition(hStdout, crdPos); printf (":"); crdPos.X = cxCenter + GAPS_LEFT_UNDERLINE_START; SetConsoleCursorPosition(hStdout, crdPos); scanf ("%d", &time.hour); crdPos.X = cxCenter + GAPS_MIDDLE_UNDERLINE_START; SetConsoleCursorPosition(hStdout, crdPos); scanf ("%d", &time.min); crdPos.X = cxCenter + GAPS_RIGHT_UNDERLINE_START; SetConsoleCursorPosition(hStdout, crdPos); scanf ("%d", &time.sec); if (time.hour < 0 || time.hour > HOUR_CIRCLE || time.min < 0 || time.min > MINUTE_CIRCLE || time.sec < 0 || time.sec > SECOND_CIRCLE) return FALSE; return TRUE; } int main(int argc, char* argv[]) { InitApplication(); (g_hStdout, g_cxCenter, g_cyCenter, g_Time); // create a event to tell the program to terminate. g_DoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL); #ifdef USE_TIMERQUEUE HANDLE hTimerQueue, hTimer; hTimerQueue = CreateTimerQueue(); if (!CreateTimerQueueTimer(&hTimer, hTimerQueue, TimerRoutine, &g_Time, 1000, 0, 0)) { printf("CreateTimerQueueTimer failed (%d)\\n", GetLastError()); return 3; } #else // create the thread. HANDLE hThreadTimer; DWORD dwThreadId; g_ThreadTerminated = FALSE; hThreadTimer = CreateThread(NULL, 0, TimerThreadProc, &g_Time, 0, &dwThreadId); if (hThreadTimer == NULL) { } #endif SetConsoleCtrlHandler(CtrlHandler, TRUE); if (WaitForSingleObject(g_DoneEvent, INFINITE) != WAIT_OBJECT_0) printf("WaitForSingleObject failed (%d)\\n", GetLastError()); #ifdef USE_TIMERQUEUE if (!DeleteTimerQueue(hTimerQueue)) printf("DeleteTimerQueue failed(%d) \\n", GetLastError()); #else g_ThreadTerminated = TRUE; if (WaitForSingleObject(hThreadTimer, INFINITE) != WAIT_OBJECT_0) printf("WaitForSingleObject failed (%d)\\n", GetLastError()); #endif return 0; } -------------------------------------------- 下面是純c的。 有幾個問題: 1.textmode函數在turboc中沒有辦法使用,不知道是什麼問題,而borland c就可以。 2.無論怎麼設置,自己的ctrlbreak函數在上述兩個環境中都不能被調用,非常遺憾。所以不能夠優雅的退出。只能按兩次ctrlbreak。 下面是程序。 ------------------------------------------ #include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> #define ABORT 0 int jump_out_loop = -1; int jump_out(void) { jump_out_loop = 1; printf("Abort ..\n"); return ABORT; } int main(void) { struct text_info ti; int center_x, center_y; int hour, min, sec; char str_out[64] = {0}; clrscr(); /*textmode(BW40);*/ /*textmode在turbo c下設置會出問題*/ gettextinfo(&ti); center_x = ti.winright / 2; center_y = ti.winbottom / 2; gotoxy(center_x - 4, center_y); cprintf(" : : "); gotoxy(center_x - 4, center_y); cscanf("%d", &hour); gotoxy(center_x - 1, center_y); cscanf("%d", &min); gotoxy(center_x + 2, center_y); cscanf("%d", &sec); /* check input valid or not */ {} setcbrk(1); ctrlbrk(jump_out); /*jump_out沒有起到作用,實在不好意思.*/ /* if (getcbrk()) printf("crtl break is on\n"); else printf("is off\n"); */ while (1) { delay(1000); sec++; if (sec >= 60) { sec -= 60; min++; if (min >= 60) { min -= 60; hour++; if (hour >= 24) { hour -= 24; } } } sprintf(str_out, "%02d:%02d:%02d", hour, min, sec); gotoxy(center_x - 4, center_y); cprintf(str_out); } /* getch();*/ return 0; }
『伍』 c語言時鍾代碼
#include<graphics.h> /* 引入graphic.h */
#include<math.h> /* 引入math.h */
#include<dos.h> /* 引入dos.h */
#define pi 3.1415926 /*定義pi=3.14159*/
#define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300;
#define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240;
#define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y) /*定義……*/
void init() /*初始化程序*/
{int i,l,x1,x2,y1,y2; /*定義……*/
setbkcolor(1); /*設置顏色*/
circle(300,240,200); /*作園*/
circle(300,240,205);
circle(300,240,5);
for(i=0;i<60;i++) /*循環(算時間)*/
{if(i%5==0) l=15;
else l=5;
x1=200*cos(i*6*pi/180)+300;
y1=200*sin(i*6*pi/180)+240;
x2=(200-l)*cos(i*6*pi/180)+300;
y2=(200-l)*sin(i*6*pi/180)+240;
line(x1,y1,x2,y2);
}
}
main()
{
int x,y;
int gd=VGA,gm=2;
unsigned char h,m,s; /*定義*/
struct time t[1];
initgraph(&gd,&gm,"d:\\tc");
init();
setwritemode(1);
gettime(t);
h=t[0].ti_hour;
m=t[0].ti_min;
s=t[0].ti_sec; /*定義時分秒*/
setcolor(7); /*設置顏色*/
d(150,h,30);
setcolor(14);
d(170,m,6);
setcolor(4);
d(190,s,6);
while(!kbhit()) /*獲取鍵盤相應*/
{while(t[0].ti_sec==s)
gettime(t); /*C語言中得到時間的函數*/
sound(400); /*計算時間……*/
delay(70);
sound(200);
delay(30);
nosound();
setcolor(4);
d(190,s,6);
s=t[0].ti_sec;
d(190,s,6);
if (t[0].ti_min!=m)
{
setcolor(14);
d(170,m,6);
m=t[0].ti_min;
d(170,m,6);
}
if (t[0].ti_hour!=h)
{ setcolor(7);
d(150,h,30);
h=t[0].ti_hour;
d(150,h,30);
sound(1000);
delay(240);
nosound();
delay(140);
sound(2000);
delay(240);
nosound();
}
}
getch(); /*設置空格後退出*/
closegraph();
}
具體的。。就是套用用幾個函數算時間。。
不要對這種很長的東西害怕,其實大部分都是在畫這個鍾~
加油哦~
『陸』 C語言編圖形時鍾
給你2個選吧,都是原創:
第1個:
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define pi 3.1415926
#define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300;
#define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240;
#define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y)
void init()
{int i,l,x1,x2,y1,y2;
setbkcolor(1);
circle(300,240,200);
circle(300,240,205);
circle(300,240,5);
for(i=0;i<60;i++)
{if(i%5==0) l=15;
else l=5;
x1=200*cos(i*6*pi/180)+300;
y1=200*sin(i*6*pi/180)+240;
x2=(200-l)*cos(i*6*pi/180)+300;
y2=(200-l)*sin(i*6*pi/180)+240;
line(x1,y1,x2,y2);
}
}
main()
{
int x,y;
int gd=VGA,gm=2;
unsigned char h,m,s;
struct time t[1];
initgraph(&gd,&gm,"d:\\tc");
init();
setwritemode(1);
gettime(t);
h=t[0].ti_hour;
m=t[0].ti_min;
s=t[0].ti_sec;
setcolor(7);
d(150,h,30);
setcolor(14);
d(170,m,6);
setcolor(4);
d(190,s,6);
while(!kbhit())
{while(t[0].ti_sec==s)
gettime(t);
sound(400);
delay(70);
sound(200);
delay(30);
nosound();
setcolor(4);
d(190,s,6);
s=t[0].ti_sec;
d(190,s,6);
if (t[0].ti_min!=m)
{
setcolor(14);
d(170,m,6);
m=t[0].ti_min;
d(170,m,6);
}
if (t[0].ti_hour!=h)
{ setcolor(7);
d(150,h,30);
h=t[0].ti_hour;
d(150,h,30);
sound(1000);
delay(240);
nosound();
delay(140);
sound(2000);
delay(240);
nosound();
}
}
getch();
closegraph();
}
第2個:
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define PI 3.1415926
#define x0 320 /*定義鍾表中心坐標*/
#define y0 240
void DrawClock(int x,int y,int color) /*畫表盤*/
{ int r=150; /*表盤的半徑*/
float th;
setcolor(color);
circle(x,y,r);
circle(x,y,2);
}
void DrawHand(int x,int y,float th,int l,int color)
{
int x1,y1;
x1=x+l*sin(th);
y1=y-l*cos(th);
setcolor(color);
line(x,y,x1,y1);
}
void main()
{int gdriver=DETECT,gmode;
struct time curtime;
float th_hour,th_min,th_sec;
initgraph(&gdriver,&gmode,"");
setbkcolor(0);
while(! kbhit())
{
DrawClock(x0,y0,14);
gettime(&curtime); /*得到當前系統時間*/
gotoxy(35,20); /*定位輸出位置*/
if((float)curtime.ti_hour<=12) /*午前的處理*/
{printf("AM ");
if((float)curtime.ti_hour<10) printf("0"); /*十點之前在小時數前加零*/
printf("%.0f:",(float)curtime.ti_hour);
}
else /*午後的處理*/
{printf("PM ");
if((float)curtime.ti_hour-12<10) printf("0");
printf("%.0f:",(float)curtime.ti_hour-12);
}
if((float)curtime.ti_min<10) printf("0");
printf("%.0f:",(float)curtime.ti_min);
if((float)curtime.ti_sec<10) printf("0");
printf("%.0f",(float)curtime.ti_sec);
/*以下三行計算表針轉動角度,以豎直向上為起點,順時針為正*/
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 */
DrawHand(x0,y0,th_hour,70,2); /*畫時針*/
DrawHand(x0,y0,th_min,110,3); /*分針*/
DrawHand(x0,y0,th_sec,140,12); /*秒針*/
sleep(1); /*延時一秒後刷新*/
cleardevice();
}
closegraph();
}
『柒』 c語言怎麼樣編寫一個時鍾程序
c語言時鍾程序代碼如下:
#include<windows.h>
#include<math.h>
#define ID_TIMER 1//計時器ID
#define TWOPI (2*3.14159)
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("Clock");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows
T"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName,TEXT("Analog Clock"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void Setsotropic(HDC hdc,int cxClient,int cyClient)
{
SetMapMode(hdc,MM_ISOTROPIC);
SetWindowExtEx(hdc,1000,1000,NULL);
SetViewportExtEx(hdc,cxClient/2,-cyClient/2,NULL);
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);
}
void RotatePoint(POINT pt[],int iNum,int iAngle)
{
int i;
POINT ptTemp;
for(i=0;i<iNum;i++)
{
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;
}
}
void DrawClock(HDC hdc)
{
int iAngle;
POINT pt[3];
for(iAngle=0;iAngle<360;iAngle+=6)
{
pt[0].x=0;
pt[0].y=900;
RotatePoint(pt,1,iAngle);
pt[2].x=pt[2].y=iAngle%5?33:100;
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;
SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Ellipse(hdc,pt[0].x,pt[0].y,pt[1].x,pt[1].y );
}
}
void DrawHands(HDC hdc,SYSTEMTIME *pst,BOOL fChange)
{
static POINT pt[3][5]={0,-150,100,0,0,600,-100,0,0,-150, 0,-200,50,0,0,800,-50,0,0,-200, 0,0,0,0,0,0,0,0,0,800 };
int i,iAngle[3];
POINT ptTemp[3][5];
iAngle[0]=(pst->wHour*30)%360+pst->wMinute/2;
iAngle[1]=pst->wMinute*6;
iAngle[2]=pst->wSecond*6;
memcpy(ptTemp,pt,sizeof(pt));
for(i=fChange?0:2;i<3;i++)
{
RotatePoint(ptTemp[i],5,iAngle[i]);
Polyline(hdc,ptTemp[i],5);
}
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static int cxClient,cyClient;
static SYSTEMTIME stPrevious;
BOOL fChange;
HDC hdc;
PAINTSTRUCT ps;
SYSTEMTIME st;
switch(message)
{
case WM_CREATE:
SetTimer(hwnd,ID_TIMER,1000,NULL);
GetLocalTime(&st);
stPrevious=st;
return 0;
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
return 0;
case WM_TIMER:
GetLocalTime(&st);
fChange=st.wHour!=stPrevious.wHour||st.wMinute!=stPrevious.wMinute;
hdc=GetDC(hwnd);
Setsotropic(hdc,cxClient,cyClient);
SelectObject(hdc,GetStockObject(WHITE_PEN));
DrawHands(hdc,&stPrevious,fChange);
SelectObject(hdc,GetStockObject(BLACK_PEN));
DrawHands(hdc,&st,TRUE);
stPrevious=st;
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
Setsotropic(hdc,cxClient,cyClient);
DrawClock(hdc);
DrawHands(hdc,&stPrevious,TRUE);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
KillTimer(hwnd,ID_TIMER);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}