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

时间:2019-03-25 14:48:02

标签: c++ winapi

我想更改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的背景颜色不会更改。任何想法为什么会这样?谢谢!

1 个答案:

答案 0 :(得分:1)

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

根据About Static Controls

  

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

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

(我们实际上并不经常在另一个静态窗口内放置一个静态窗口。这不是常见的操作。因此,您应将subItem的父窗口重置为hwnd。)