您可以使用 Windows API 函数来实现有字体的时钟显示。以下是一个简单的示例代码:
```c++
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 创建窗口
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = L"ClockWindowClass";
RegisterClass(&wc);
HWND hWnd = CreateWindow(L"ClockWindowClass", L"Clock", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
// 显示窗口
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 消息循环
MSG msg = { 0 };
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HFONT hFont = nullptr;
static RECT rcClient = { 0 };
static SYSTEMTIME st = { 0 };
static WCHAR szTime[9] = { 0 };
switch (message)
{
case WM_CREATE:
// 创建字体
hFont = CreateFont(48, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Arial");
GetLocalTime(&st);
break;
case WM_DESTROY:
// 销毁字体
if (hFont)
{
DeleteObject(hFont);
}
PostQuitMessage(0);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// 获取客户区大小
GetClientRect(hWnd, &rcClient);
// 计算文本位置
SIZE size = { 0 };
GetTextExtentPoint32(hdc, szTime, 8, &size);
int x = (rcClient.right - size.cx) / 2;
int y = (rcClient.bottom - size.cy) / 2;
// 绘制文本
SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(0, 0, 255));
SetBkMode(hdc, TRANSPARENT);
DrawText(hdc, szTime, 8, &rcClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndPaint(hWnd, &ps);
}
break;
case WM_TIMER:
// 更新时间
GetLocalTime(&st);
wsprintf(szTime, L"%02d:%02d:%02d", st.wHour, st.wMinute, st.wSecond);
InvalidateRect(hWnd, &rcClient, TRUE);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
```
该代码使用 CreateFont 函数创建了一个 Arial 字体的 HFONT 句柄,然后在 WM_PAINT 消息中使用 DrawText 函数绘制了当前时间。在 WM_TIMER 消息中更新时间,并使用 InvalidateRect 函数使窗口无效,以便在下一个 WM_PAINT 消息中重新绘制。