/*
功能:顯示時間
文中有註釋
編譯器以及環境:VS2013/WINDOWS7
完整程式碼如下:
*/
#include<graphics.h>
#include<time.h>
#include<math.h>
#include<conio.h>
#include<stdio.h>
#define PI 3.141592653589793
//畫時鐘盤
void draw();
//畫表針
void drawHand(int hour, int minute, int second, int Milliseconds);
//顯示年月日 星期
void showDate(int year, int month, int date, int day);
int main()
{
//建立視窗
initgraph(600, 600);
setwritemode(R2_XORPEN);
//畫時鐘盤
draw();
//畫表針
//drawHand();
//定義時間變數儲存時間
SYSTEMTIME ti;
while(1)
{
//獲取當前時間
GetLocalTime(&ti);
//動態畫時鐘指標
drawHand(ti.wHour, ti.wMinute, ti.wSecond, ti.wMilliseconds);
//顯示上午AM 或下午PM
setbkmode(TRANSPARENT);
if (ti.wHour>0 && ti.wHour<12)
{
outtextxy(75, 70, _T("AM."));
}
else
{
outtextxy(75, 70, _T("PM."));
}
//顯示年月日 星期
showDate(ti.wYear, ti.wMonth,ti.wDay, ti.wDayOfWeek);
//每隔1毫秒重畫時鐘指標
Sleep(999);
drawHand(ti.wHour, ti.wMinute, ti.wSecond, ti.wMilliseconds);
}
/*
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
*/
closegraph();
return 0;
}
//繪製錶針
void drawHand(int hour, int minute, int second,int Milliseconds)
{
//對應錶盤偏轉弧度制 12點位置定了0度 h m s分別表示時/分/秒對應弧度
double h, m, s;
//以中心為起點針的繪製的結束點位置座標
double xh, yh, xm, ym, xs, ys;
//每毫秒所有針轉過弧度值
double a = PI / 30000.0;
//錶盤中最小刻度弧度值
double b = PI/30.0;
//設定座標原點
setorigin(300, 300);
//設定分針長180 / 時針長155 / 秒針長190
//利用三角函式求出針所在位置
//y軸正方向朝下
s = second*1000.0 * a;
m = minute*b+second*50/3*a;
h = hour*b*5+minute*b/12;
xh = 155.0 * sin(h);
yh = 155.0 * cos(h);
xm = 180.0 * sin(m);
ym = 180.0 * cos(m);
xs = 190.0 * sin(s);
ys = 190.0 * cos(s);
//繪製秒針
setlinestyle(PS_SOLID | PS_JOIN_ROUND | PS_ENDCAP_ROUND, 3);
setlinecolor(RED);
line(0, 0, xs, -ys);
//繪製分針
setlinestyle(PS_SOLID | PS_JOIN_ROUND | PS_ENDCAP_ROUND, 5);
setlinecolor(GREEN);
line(0, 0, xm, -ym);
//繪製時針
setlinestyle(PS_SOLID | PS_JOIN_ROUND | PS_ENDCAP_ROUND, 10);
setlinecolor(GREEN);
line(0, 0, xh, -yh);
}
//畫時鐘盤
void draw()
{
//這種視窗中心為原點
setorigin(300, 300);
//繪製外圓
circle(0, 0, 250);
//繪製內圓
circle(0, 0, 225);
//繪製針軸小圓點
circle(0, 0, 2);
//輔助圓
//circle(0, 0, 190);
//繪製刻度
int x, y,x1,y1;
for (int i = 0; i < 60;i++)//2*PI=360度 時刻度間隔弧度為2*PI/12即PI/6 ; 分刻度間隔弧度為2*PI/60
{
//設定字型
settextstyle(22, NULL, _T("楷體"));
x = 220*sin(i*PI/30);
y = 220*cos(i*PI/30);
x1 = 210 * sin(i*PI/30);
y1 = 210 * cos(i*PI/30);
//翻轉座標成數學座標
y = -1 * y;
y1 = -1 * y1;
switch(i)
{ //繪製3,6,9,12數字對應的位置
//不用使用for迴圈因為了方便微調各個數字文字座標
case 0:
outtextxy(x1-10, y1-4, _T("12"));
break;
case 15:
outtextxy(x1-8, y1-10, _T("3"));
break;
case 30:
outtextxy(x1-5, y1-15, _T("6"));
break;
case 45:
outtextxy(x1, y1-10, _T("9"));
break;
case 5:
outtextxy(x1-8 , y1-6 , _T("1"));
break;
case 10:
outtextxy(x1-8 , y1-7, _T("2"));
break;
case 20:
outtextxy(x1-7 , y1-14 , _T("4"));
break;
case 25:
outtextxy(x1-6 , y1-14 , _T("5"));
break;
case 35:
outtextxy(x1-3 , y1-13 , _T("7"));
break;
case 40:
outtextxy(x1-1 , y1-12 , _T("8"));
break;
case 50:
outtextxy(x1-2 , y1-7 , _T("10"));
break;
case 55:
outtextxy(x1-2 , y1-7 , _T("11"));
break;
default:
break;
}
if (i % 5 == 0)
{
setfillcolor(RGB(255,255,0));
fillrectangle(x - 4, y - 4, x +4, y +4);
}
else
fillcircle(x, y, 2);
}
}
//顯示年/月/日 星期幾
void showDate(int year, int month, int date ,int day)
{
setorigin(0, 0);
//struct dday
//{
wchar_t y[10];
wchar_t m[10];
wchar_t d[10];
wchar_t wd[7][10] = {_T("星期日"),_T("星期一"),_T("星期二"),_T("星期三"),_T("星期四"),_T("星期五"),_T("星期六")};
//}D;
_itow_s(year, y,10);
wcscat(y, _T("年"));
_itow_s(month, m, 10);
wcscat(m,_T("月"));
_itow_s(date, d, 10);
wcscat(d,_T("日"));
//去除文字背景色
setbkmode(TRANSPARENT);
outtextxy(205, 370, y);
outtextxy(285, 370, m);
outtextxy(320, 370, d);
switch (day)
{
case 0:
outtextxy(355, 20, wd[0]);
break;
case 1:
outtextxy(275, 400, wd[1]);
break;
case 2:
outtextxy(355, 20, wd[2]);
break;
case 3:
outtextxy(355, 20, wd[3]);
break;
case 4:
outtextxy(355, 20, wd[4]);
break;
case 5:
outtextxy(355, 20, wd[5]);
break;
case 6:
outtextxy(355, 20, wd[6]);
break;
default:
outtextxy(355, 20, wd[7]);
break;
}
}
//成品截圖,因為時鐘是動態的,圖是靜態所以圖是不會動的
//流程圖