Lion King
Lion King

Reputation: 33813

Changing the text of the "static text" control and its color at once (a bad behavior occurred)

I am trying to change the text of the "static text" control and its color at once, and I have done that, but the problem is when changing the text first and then changing the color of that text, it takes a little noticeable time between changing the text and its color.

bool IsGameOpen = false;
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
    case WM_INITDIALOG:
    {
        SetTimer(hDlg, GAME_STATUS_TIMER, 1000, NULL);
        return TRUE;
    }
    case WM_TIMER:
        switch (wParam) {
        case GAME_STATUS_TIMER:
            if (Mem->FindProcess()) {
                SetDlgItemTextW(hDlg, GAME_CURRENT_STATUS_LBL, L"Open");
                IsGameOpen = true;

            } else {
                SetDlgItemTextW(hDlg, GAME_CURRENT_STATUS_LBL, L"Closed");
                IsGameOpen = false;
            }
            break;
        }
        return TRUE;
    case WM_CTLCOLORSTATIC:
    {
        if ((HWND)lParam == GetDlgItem(hDlg, GAME_CURRENT_STATUS_LBL)) {
            if (IsGameOpen) {
                SetTextColor((HDC)wParam, RGB(29, 122, 9));
                return (BOOL)GetSysColorBrush(COLOR_MENU);
            } else {
                SetTextColor((HDC)wParam, RGB(176, 12, 12));
                return (BOOL)GetSysColorBrush(COLOR_MENU);
            }
        }
        break;
    }
    }

    return FALSE;
}

What's wrong with my code that makes the program take a little noticeable time between changing the text and its color?

Upvotes: 0

Views: 147

Answers (1)

Remy Lebeau
Remy Lebeau

Reputation: 595402

As stated in comments, the Static control is likely being repainted immediately, and thus sending WM_CTLCOLORSTATIC to you, while SetDlgItemTextW() is being processed, but you haven't updated your IsGameOpen variable yet, so the new color doesn't take effect until the next time the Static control has to be repainted.

Try this instead:

case GAME_STATUS_TIMER:
    IsGameOpen = Mem->FindProcess();
    SetDlgItemTextW(hDlg, GAME_CURRENT_STATUS_LBL, IsGameOpen ? L"Open" : L"Closed");
    break;

Upvotes: 3

Related Questions