在 win32 中使用 DWM 时,如何以编程方式更改窗口边框和标题栏背景的颜色?

发布于 2025-01-10 16:21:22 字数 1075 浏览 0 评论 0原文

我想在 win32 中使用 DWM 自定义窗口框架以获得类似 VS2022(在标题栏上绘制菜单)或 Chrome(在标题栏上绘制选项卡)的外观,因此我使用 DwmExtendFrameIntoClientArea 函数,其边距为 {0, 0, 标题高度, 0}。不幸的是,它显示了一个宽度为 1 像素的白色窗口边框和白色标题栏区域。我使用函数 DwmDefWindowProc 来处理系统消息并显示系统控制按钮(最小、最大、关闭按钮)。但我不知道如何更改窗口边框和标题栏背景的颜色。如果我用WM_PAINT绘画,它可能会覆盖系统控制按钮并且看起来很奇怪。如果我用WM_NCPAINT绘画,WS_THICKFRAME风格的窗口阴影可能会消失,需要绘制,我觉得很难做到。

另外,1像素宽度的边框可能来自以下代码:

if (message == WM_NCCALCSIZE) {
    auto client_area_needs_calculating = static_cast<bool>(wparam);
        if (client_area_needs_calculating) {
            auto parameters = reinterpret_cast<NCCALCSIZE_PARAMS*>(lparam);
            auto& requested_client_area = parameters->rgrc[0];
            requested_client_area.right -= GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
            requested_client_area.left += GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
            requested_client_area.bottom -= GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
            return 0;
            }
        }

I want to customize the window frame using DWM in win32 to get an appearance like VS2022 (draw menu on title bar) or Chrome (draw tabs on title bar), so I use the function DwmExtendFrameIntoClientArea with margin {0, 0, caption height, 0}. Unfortunately, it shows a white window border with 1-pixel width and white title bar area. I use the function DwmDefWindowProc to handle the system messages and show the system control buttons (min, max, close button). But I have no idea how to change the color of the window border and title bar background. If I paint in WM_PAINT, it may cover the system control buttons and looks weird. If I paint in WM_NCPAINT, the window shadow with WS_THICKFRAME style may disappear and need to draw which I feel is difficult to do.

Additionally, the 1-pixel width border may come from the following code:

if (message == WM_NCCALCSIZE) {
    auto client_area_needs_calculating = static_cast<bool>(wparam);
        if (client_area_needs_calculating) {
            auto parameters = reinterpret_cast<NCCALCSIZE_PARAMS*>(lparam);
            auto& requested_client_area = parameters->rgrc[0];
            requested_client_area.right -= GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
            requested_client_area.left += GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
            requested_client_area.bottom -= GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
            return 0;
            }
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文