无法更改另一个窗口内窗口的背景颜色

问题描述 投票:0回答:1

我想要更改STATIC窗口的背景颜色 - 加载并在运行时更改它。到目前为止,我已经能够通过以下方式更改颜色:

    case WM_CTLCOLORSTATIC:
    {
        HDC hdcStatic = (HDC)wParam;
        SetTextColor(hdcStatic, RGB(200, 200, 20));
        SetBkColor(hdcStatic, RGB(10, 10, 10));
        SetBkMode(hdcStatic, TRANSPARENT);
        return (INT_PTR)CreateSolidBrush(RGB(30, 30, 30));
    }

除了在另一个静态窗口内的任何STATIC窗口外,一切正常并且背景颜色会发生变化:

HWND mainContainer = CreateWindowEx
(
    0,
    _TEXT("STATIC"),
    "",
    WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_SOLID,
    10, 10, 500, 500,
    hwnd,
    NULL,
    (HINSTANCE)GetWindowLong(hwnd, GWLP_HINSTANCE),
    NULL
);

HWND subItem = CreateWindowEx
(
    0,
    _TEXT("STATIC"),
    "SubItem",
    WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_SOLID,
    10, 10, 100, 100,
    mainContainer,
    NULL,
    (HINSTANCE)GetWindowLong(mainContainer, GWLP_HINSTANCE),
    NULL
);

在这种情况下,mainContainer颜色会更改,但不会更改subItem的背景颜色。任何想法为什么会这样?谢谢!

c++ winapi
1个回答
1
投票

消息WM_CTLCOLORSTATIC将仅发送到父窗口,而不是父窗口的父窗口。

About Static Controls说:

预定义静态控制窗口类的窗口过程对静态控制过程不处理的所有消息执行默认处理。

WM_CTLCOLORSTATIC不在它处理的列表中。因此,预定义的窗口过程将消息传递给DefWindowProc以进行默认处理。

(我们实际上并不经常在另一个静态窗口中放置一个静态窗口。这不是常见的操作。所以你应该将subItem的父窗口重置为hwnd。)

© www.soinside.com 2019 - 2024. All rights reserved.