WM_CTLCOLORSTATIC никогда не запускается в приложении WIN32 - PullRequest
0 голосов
/ 27 октября 2018

Я делаю приложение для 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;
}

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

1 Ответ

0 голосов
/ 27 октября 2018

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;
}
...