c++ - 无法更改位于另一个窗口内的窗口的背景颜色

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

最佳答案

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

根据 About Static Controls :

The window procedure for the predefined static control window class performs default processing for all messages that the static control procedure does not process.

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

(我们真的不经常把一个静态窗口放在另一个静态窗口里面,这不是一个常见的操作。所以你应该将subItem的父窗口重置为hwnd.)

关于c++ - 无法更改位于另一个窗口内的窗口的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55340480/

相关文章:

winforms - 在 Windows 中更改另一个进程的任务栏图标

http - 即使从 WinHTTP 格式错误,也能检索 HTTP 响应

c - 在 Windows 中打印文件

c++ - PathGetArgs/PathRemoveArgs 与 CommandLineToArgvW - 有区别吗?

c++ - 模板子类指针问题

c++ - 创建包含唯一元素的优先级队列

c++ - 检查 CppUnit 中的 printf 输出

c++ - 用简单的程序访问违规阅读位置

c++ - GCC __builtin_ 函数

delphi - 如何从 DLL 返回实例?