-/* Core functions lifted from Programming Windows, Charles Petzold */\r
+/* Code based on clock.c from Programming Windows, Charles Petzold */\r
\r
#include "timedate.h"\r
\r
\r
VOID SetIsotropic(HDC hdc, INT cxClient, INT cyClient)\r
{\r
- SetMapMode (hdc, MM_ISOTROPIC);\r
- SetWindowExtEx (hdc, 1000, 1000, NULL);\r
- SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL);\r
- SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL);\r
+ /* set isotropic mode */\r
+ SetMapMode(hdc, MM_ISOTROPIC);\r
+ /* position axis in centre of window */\r
+ SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);\r
}\r
\r
VOID RotatePoint(POINT pt[], INT iNum, INT iAngle)\r
\r
VOID DrawClock(HDC hdc)\r
{\r
- INT iAngle;\r
+ INT iAngle;\r
POINT pt[3];\r
\r
- for (iAngle = 0; iAngle < 360; iAngle += 6)\r
+ /* grey brush to fill the dots */\r
+ SelectObject(hdc, CreateSolidBrush(RGB(128, 128, 128)));\r
+\r
+ for(iAngle = 0; iAngle < 360; iAngle += 6)\r
{\r
+ /* starting coords */\r
pt[0].x = 0;\r
- pt[0].y = 900;\r
- \r
+ pt[0].y = 180;\r
+\r
+ /* rotate start coords */\r
RotatePoint(pt, 1, iAngle);\r
- \r
- pt[2].x = pt[2].y = iAngle % 5 ? 33 : 100;\r
- \r
+\r
+ /* determine whether it's a big dot or a little dot\r
+ * i.e. 1-4 or 5, 6-9 or 10, 11-14 or 15 */\r
+ if (iAngle % 5)\r
+ {\r
+ pt[2].x = pt[2].y = 7;\r
+ SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB(128, 128, 128)));\r
+\r
+ }\r
+ else\r
+ {\r
+ pt[2].x = pt[2].y = 16;\r
+ SelectObject(hdc, GetStockObject(BLACK_PEN));\r
+ }\r
+\r
pt[0].x -= pt[2].x / 2;\r
pt[0].y -= pt[2].y / 2;\r
- \r
+\r
pt[1].x = pt[0].x + pt[2].x;\r
pt[1].y = pt[0].y + pt[2].y;\r
- \r
- SelectObject(hdc, GetStockObject (BLACK_BRUSH));\r
- \r
+\r
Ellipse(hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y);\r
+\r
}\r
}\r
\r
VOID DrawHands(HDC hdc, SYSTEMTIME * pst, BOOL fChange)\r
{\r
- static POINT pt[3][5] = { {{0, -150}, {100, 0}, {0, 600}, {-100, 0}, {0, -150}},\r
- {{0, -200}, { 50, 0}, {0, 800}, { -50, 0}, {0, -200}},\r
- {{0, 0}, { 0, 0}, {0, 0}, { 0, 0}, {0, 800}} };\r
+ static POINT pt[3][5] = { {{0, -30}, {20, 0}, {0, 100}, {-20, 0}, {0, -30}},\r
+ {{0, -40}, {10, 0}, {0, 160}, {-10, 0}, {0, -40}},\r
+ {{0, 0}, { 0, 0}, {0, 0}, { 0, 0}, {0, 160}} };\r
INT i, iAngle[3];\r
POINT ptTemp[3][5];\r
- \r
+\r
+ /* Black pen for outline, white brush for fill */\r
+ SelectObject(hdc, GetStockObject(BLACK_PEN));\r
+ SelectObject(hdc, GetStockObject(WHITE_BRUSH));\r
+\r
iAngle[0] = (pst->wHour * 30) % 360 + pst->wMinute / 2;\r
iAngle[1] = pst->wMinute * 6;\r
iAngle[2] = pst->wSecond * 6;\r
- \r
+\r
memcpy(ptTemp, pt, sizeof(pt));\r
- \r
- for (i = fChange ? 0 : 2 ; i < 3 ; i++)\r
+\r
+ for(i = fChange ? 0 : 2; i < 3; i++)\r
{\r
RotatePoint(ptTemp[i], 5, iAngle[i]);\r
- \r
+\r
Polygon(hdc, ptTemp[i], 5);\r
}\r
}\r
{\r
static INT cxClient, cyClient;\r
static SYSTEMTIME stPrevious;\r
- BOOL fChange;\r
HDC hdc;\r
PAINTSTRUCT ps;\r
SYSTEMTIME st;\r
case WM_TIMER:\r
GetLocalTime(&st);\r
\r
- fChange = st.wHour != stPrevious.wHour ||\r
- st.wMinute != stPrevious.wMinute;\r
-\r
- hdc = GetDC(hwnd);\r
-\r
- SetIsotropic(hdc, cxClient, cyClient);\r
-\r
InvalidateRect(hwnd, NULL, TRUE);\r
\r
- SelectObject(hdc, GetStockObject(BLACK_PEN));\r
- DrawHands(hdc, &st, TRUE);\r
-\r
- ReleaseDC(hwnd, hdc);\r
-\r
stPrevious = st;\r
break;\r
\r
SetIsotropic(hdc, cxClient, cyClient);\r
\r
DrawClock(hdc);\r
- SelectObject(hdc, GetStockObject(WHITE_BRUSH));\r
DrawHands(hdc, &stPrevious, TRUE);\r
\r
EndPaint(hwnd, &ps);\r