1、新建项目
打开 Visual Studio,文件 -> 新建 -> 项目 -> Visual C++ -> Windows 桌面应用程序,创建一个新的 桌面应用程序项目。如下图,
2、项目代码
项目新建完成后,直接将项目中 “源文件” 文件夹中.cpp文件的内容替换成如下代码:
#include <windows.h>
#include <math.h>
#include <time.h>
HINSTANCE hInst;
HWND hWnd;
constexpr auto M_PI = 3.14159265358979323846;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void DrawClock(HDC hdc, int width, int height);
void DrawHand(HDC hdc, double angle, double length, int width, int height);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = TEXT("ClockWindowClass");
RegisterClass(&wc);
hWnd = CreateWindow(wc.lpszClassName, TEXT("Analog Clock"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
RECT rect;
GetClientRect(hWnd, &rect);
DrawClock(hdc, rect.right, rect.bottom);
EndPaint(hWnd, &ps);
} break;
case WM_TIMER:
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_CREATE:
SetTimer(hWnd, 1, 1000, NULL);
break;
case WM_DESTROY:
KillTimer(hWnd, 1);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void DrawClock(HDC hdc, int width, int height) {
HPEN hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
SelectObject(hdc, hPen);
int centerX = width / 2;
int centerY = height / 2;
int radius = min(centerX, centerY) - 20;
Ellipse(hdc, centerX - radius, centerY - radius, centerX + radius, centerY + radius);
time_t now = time(NULL);
struct tm *t = localtime(&now);
double hourAngle = ((t->tm_hour % 12) + t->tm_min / 60.0) * 30.0;
double minuteAngle = (t->tm_min + t->tm_sec / 60.0) * 6.0;
double secondAngle = t->tm_sec * 6.0;
DrawHand(hdc, hourAngle, radius * 0.5, centerX, centerY);
DrawHand(hdc, minuteAngle, radius * 0.75, centerX, centerY);
DeleteObject(hPen);
hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
SelectObject(hdc, hPen);
DrawHand(hdc, secondAngle, radius * 0.9, centerX, centerY);
DeleteObject(hPen);
}
void DrawHand(HDC hdc, double angle, double length, int centerX, int centerY) {
angle = angle - 90;
double radian = angle * M_PI / 180;
int xEnd = centerX + (int)(length * cos(radian));
int yEnd = centerY + (int)(length * sin(radian));
MoveToEx(hdc, centerX, centerY, NULL);
LineTo(hdc, xEnd, yEnd);
}
运行效果: