我想在事件触发每10毫秒时更改一组标签(8 X 8)背景颜色,我使用的是每个10毫秒调用的线程CreateThread(NULL, 0, colorLabel, NULL, 0, 0);
DWORD WINAPI colorLabel(LPVOID lpParameter) {
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
if (hBrushLabel) {
DeleteObject(hBrushLabel);
hBrushLabel = NULL;
}
clrLabelBkGnd = RGB((i * 4) % 255, (j * 4) % 255, 0x00);
InvalidateRect(hWndLabel[i][j], NULL, TRUE);
}
}
colored = 1;
return 0;
}
CALLBACK计划:
case WM_CTLCOLORSTATIC:
hdc = reinterpret_cast<HDC>(wParam);
SetTextColor(hdc, clrLabelText);
SetBkColor(hdc, clrLabelBkGnd);
if (!hBrushLabel) hBrushLabel = CreateSolidBrush(clrLabelBkGnd);
return reinterpret_cast<LRESULT>(hBrushLabel);
但是这个方法太重了,显示器被破坏了
是否有任何优化方式可以每隔10毫秒更改标签颜色显示
答案 0 :(得分:0)
编辑:使用此方法,许多较旧的计算机可能无法处理10毫秒的延迟。最小30毫秒延迟更好,或者更高一点。这也不适用于游戏,它适用于非游戏程序中的轻量级动画
编辑2:更改了GetDC
的调用方式
另一种选择是绘制矩形和文本,然后Sleep
绘制10毫秒。实际绘画可能需要几毫秒,在这种情况下使用QueryPerformanceCounter
睡眠时间少于10毫秒。请注意,除非在WM_PAINT
中完成某些操作,否则不会保存这些更改。
DWORD WINAPI foo(LPVOID p)
{
HWND hwnd = (HWND)p;
LARGE_INTEGER frequency, clock1, clock2;
QueryPerformanceFrequency(&frequency);
wchar_t buf[100];
for (int i = 0; i < 100; i++)
{
QueryPerformanceCounter(&clock1);
HDC hdc = GetDC(hwnd);//release hdc as soon as possible
wsprintf(buf, L"%i\n", i);
RECT rc = {0,0,50,20};
COLORREF bkcolor = RGB(128, 255, 255);
HBRUSH brush = CreateSolidBrush(bkcolor);
SetBkColor(hdc, bkcolor);
FillRect(hdc, &rc, brush);
DeleteObject(brush);
TextOut(hdc, rc.left, rc.top, buf, lstrlen(buf));
ReleaseDC(hwnd, hdc);
QueryPerformanceCounter(&clock2);
int delay = int(((clock2.QuadPart - clock1.QuadPart) * 1000) / frequency.QuadPart);
if (delay < 10)
Sleep(10 - delay); //10 millisecond delay
}
return 123;
}
...
CreateThread(NULL, 0, foo, hwnd, 0, NULL);