// ------------------ 窗口消息处理 ------------------
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
ClearLogFile();
current_vehicle_speed = 0;
// 创建暂停按钮
HWND pauseButton = CreateWindowW(
L"BUTTON", L"Pause", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
160, 200, 100, 30, hwnd, (HMENU)IDC_PAUSE_BUTTON, NULL, NULL
);
HANDLE thread = CreateThread(NULL, 0, WorkerThread, hwnd, 0, NULL);
if (!thread)
{
MessageBox(NULL, L"Error", L"Failed to create thread", MB_ICONERROR);
PostQuitMessage(-1);
}
CloseHandle(thread);
break;
}
case WM_USER + 1:
{
wchar_t buffer[256];
// 将总行驶距离从毫米转换为米(四舍五入到米)
uint64_t total_distance_m = (total_distance_mm + 500) / 1000;
// 获取当前系统时间
SYSTEMTIME st;
GetLocalTime(&st);
swprintf(buffer, 256, L"Time: %02d:%02d:%02d", st.wHour, st.wMinute, st.wSecond);
// 获取客户区大小
RECT clientRect;
GetClientRect(hwnd, &clientRect);
// 定义动态内容区域,避免覆盖按钮部分
RECT dynamicRect = clientRect;
dynamicRect.bottom -= 110; // 保留底部按钮区域
// 获取设备上下文
HDC hdc = GetDC(hwnd);
HDC memDC = CreateCompatibleDC(hdc); // 创建内存DC
HBITMAP memBitmap = CreateCompatibleBitmap(hdc, dynamicRect.right - dynamicRect.left, dynamicRect.bottom - dynamicRect.top);
SelectObject(memDC, memBitmap); // 将位图选入内存DC
// 填充动态内容区域背景
HBRUSH hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); // 默认窗口背景色
FillRect(memDC, &dynamicRect, hBrush);
DeleteObject(hBrush);
// 设置字体
HFONT hFont = CreateFontW(
36, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, L"Arial");
HFONT oldFont = SelectObject(memDC, hFont);
// 打印当前时间
RECT timeRect = {
dynamicRect.left + 50,
dynamicRect.top + 10,
dynamicRect.right - 50,
dynamicRect.top + 50 // 时间显示区域
};
SetTextColor(memDC, RGB(0, 0, 0)); // 黑色字体
DrawTextW(memDC, buffer, -1, &timeRect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
// 打印车辆速度
RECT speedRect = {
dynamicRect.left + 50,
dynamicRect.top + 70,
dynamicRect.right - 50,
dynamicRect.bottom - 50
};
swprintf(buffer, 256, L"Speed: %d km/h", current_vehicle_speed);
SetTextColor(memDC, RGB(0, 0, 255)); // 蓝色字体
DrawTextW(memDC, buffer, -1, &speedRect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
// 打印总行驶距离
RECT distanceRect = {
dynamicRect.left + 50,
dynamicRect.top + 150,
dynamicRect.right - 50,
dynamicRect.bottom - 30
};
if (total_distance_m >= 100000)
{
swprintf(buffer, 256, L"Distance: %.1f km",total_distance_m / 1000.0); // 显示为 km(保留1位小数)
}
else
{
swprintf(buffer, 256, L"Distance: %d m", (int)total_distance_m); // 显示为米
}
SetTextColor(memDC, RGB(255, 0, 0)); // 红色字体
DrawTextW(memDC, buffer, -1, &distanceRect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
// 将内存DC的内容复制到动态区域
BitBlt(hdc, dynamicRect.left, dynamicRect.top, dynamicRect.right - dynamicRect.left, dynamicRect.bottom - dynamicRect.top, memDC, 0, 0, SRCCOPY);
// 清理资源
SelectObject(memDC, oldFont);
DeleteObject(hFont);
DeleteDC(memDC);
DeleteObject(memBitmap);
ReleaseDC(hwnd, hdc);
break;
}
case WM_COMMAND:
{
if (LOWORD(wParam) == IDC_PAUSE_BUTTON)
{
is_paused = !is_paused;
HWND pauseButton = GetDlgItem(hwnd, IDC_PAUSE_BUTTON);
SetWindowTextW(pauseButton, is_paused ? L"Resume" : L"Pause");
}
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
default:
{
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
return 0;
}
// ------------------ 主程序入口 ------------------
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
WNDCLASSW wc = {0};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = L"VehicleLogger";
if (!RegisterClassW(&wc)) return -1;
HWND hwnd = CreateWindowW(
L"VehicleLogger", L"CAN Signal Logger", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 450, 300, NULL, NULL, hInstance, NULL
);
if (!hwnd) return -1;
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
接着修改代码规范
最新发布