Как определить нажатие клавиши в методе оконной процедуры? - PullRequest
0 голосов
/ 27 мая 2020

Я немного новичок в C ++, и я пытаюсь создать приложение gui, чтобы узнать, активен ли мой Caps Lock или нет. Я уже настроил пользовательский интерфейс basi c, и он запускается по плану (показывая мне состояние блокировки с помощью цветов), но мне не удается изменить цвет окна во время выполнения.

вот мой код:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
bool state = false;
switch (uMsg) {
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        // All painting occurs here, between BeginPaint and EndPaint.
        if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0) {
            FillRect(hdc, &ps.rcPaint, CreateSolidBrush(RGB(0, 255, 0)));
        }
        else {
            FillRect(hdc, &ps.rcPaint, CreateSolidBrush(RGB(255, 0, 0)));
        }

        EndPaint(hwnd, &ps);
    }
    case WM_KEYUP:
    {

        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        // All painting occurs here, between BeginPaint and EndPaint.
        if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0) {
            FillRect(hdc, &ps.rcPaint, CreateSolidBrush(RGB(0, 255, 0)));
        }
        else {
            FillRect(hdc, &ps.rcPaint, CreateSolidBrush(RGB(255, 0, 0)));
        }

        EndPaint(hwnd, &ps);
    }
    return 0;
}

return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

и заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Не вызывайте (Begin/End)Paint() в обработчике WM_KEYUP и не вызывайте GetKeyState() в обработчике WM_PAINT. Попросите WM_KEY(DOWN|UP) сохранить желаемый цвет в переменной, а затем вызвать InvalidateRect(), когда эта переменная изменит значение, чтобы вызвать перерисовку вашего окна. Пусть WM_PAINT нарисует окно, используя текущее значение этой переменной по мере необходимости.

Кроме того, в ваших блоках case отсутствуют операторы break. И у вас утечка HBRUSH, возвращенного CreateSolidBrush().

Попробуйте что-то еще примерно так:

COLORREF color;

void UpdateColorForCapsLock()
{
    if (GetKeyState(VK_CAPITAL) & 0x0001) {
        color = RGB(0, 255, 0);
    }
    else {
        color = RGB(255, 0, 0);
    }
}

RESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg) {
        case WM_CREATE:
        {
            UpdateColorForCapsLock();
            break;
        }

        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            HBRUSH hBrush = CreateSolidBrush(color);
            FillRect(hdc, &ps.rcPaint, hBrush);
            DeleteObject(hBrush);
            EndPaint(hwnd, &ps);
            return 0;
        }

        case WM_KEYDOWN:
        case WM_KEYUP:
        {
            if (wParam == VK_CAPITAL)
            {
                UpdateColorForCapsLock();
                InvalidateRect(hwnd, NULL, TRUE);
            }
            break;
        }
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
0 голосов
/ 27 мая 2020

Захватить сообщение WM_KEYDOWN. Если я нажимаю клавишу Caps Lock (проверьте параметры), заставьте ваше окно перерисовать само себя, вызвав InvalidateRect.

...