WM_CTLCOLORSTATIC никогда не запускается в приложении WIN32

Я делаю приложение Win32 на C++. У меня статическое окно, и я хочу изменить цвет фона.

Я следил за тем, что предлагается здесь: как программно установить цвет фона статических элементов управления

Но в моем случае WM_CTLCOLORSTATIC никогда не запускается. Вы хоть представляете, что может происходить?

Вот часть моего кода:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            case WM_CTLCOLORSTATIC:
                hdc = reinterpret_cast<HDC>(wParam);
                SetTextColor(hdc, RGB(2000, 50, 100));
                SetBkColor(hdc, RGB(20, 150, 100));
                if (!hBrushLabel) hBrushLabel = CreateSolidBrush(RGB(20, 150, 100));
                return reinterpret_cast<LRESULT>(hBrushLabel);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_CREATE:
        hBrushLabel = NULL;
        AddBuyButtons(hWnd);
        AddText(hWnd);
        AddCartonesSlots(hWnd);
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code that uses hdc here...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        if (hBrushLabel) DeleteObject(hBrushLabel);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

И моя функция изменения, которую я проверил, называется:

DWORD WINAPI changecolor(HWND h)
{
    if (hBrushLabel) {
        DeleteObject(hBrushLabel);
        hBrushLabel = NULL;
    }
    InvalidateRect(h, NULL, TRUE);
    return 0;
}

Надеюсь, ты сможешь мне помочь!

Вы поместили case WM_CTLCOLORSTATIC в неправильный оператор переключения.

Raymond Chen 27.10.2018 01:21

OMG, я такой глупый. Спасибо!

Carlos Hernández 27.10.2018 01:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
201
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

WM_CTLCOLORSTATIC - это собственное оконное сообщение, но вы обрабатываете его, как если бы это был идентификатор меню для сообщения WM_COMMAND. Вам нужно переместить обработчик case WM_CTLCOLORSTATIC из внутреннего блока switch во внешний блок switch:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            }
        }
        break;

    // MOVED HERE!!!
    case WM_CTLCOLORSTATIC:
        hdc = reinterpret_cast<HDC>(wParam);
        SetTextColor(hdc, RGB(2000, 50, 100));
        SetBkColor(hdc, RGB(20, 150, 100));
        if (!hBrushLabel) hBrushLabel = CreateSolidBrush(RGB(20, 150, 100));
        return reinterpret_cast<LRESULT>(hBrushLabel);
        break;

    case WM_CREATE:
        hBrushLabel = NULL;
        AddBuyButtons(hWnd);
        AddText(hWnd);
        AddCartonesSlots(hWnd);
        break;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code that uses hdc here...
            EndPaint(hWnd, &ps);
        }
        break;

    case WM_DESTROY:
        if (hBrushLabel) DeleteObject(hBrushLabel);
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

Другие вопросы по теме