每10毫秒更改标签颜色的优化方法

时间:2015-10-03 17:43:24

标签: winapi visual-c++

我想在事件触发每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毫秒更改标签颜色显示

1 个答案:

答案 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);