You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WIN32应用深色模式适配:菜单栏颜色异常问题求助

解决WIN32菜单栏适配深色模式问题

无需自定义绘制的适配方案

你当前仅配置了窗口的DWM属性,但菜单栏的深色适配需要额外的系统主题关联设置,以下是可行的原生解决方案:

1. 启用程序的视觉样式支持

这是菜单跟随系统主题的基础,在应用初始化阶段添加链接器指令,确保程序加载最新的通用控件视觉样式:

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

2. 补充窗口DWM属性设置

在你现有代码的基础上,添加系统着色颜色相关的属性设置,让菜单能感知系统的深色配色:

// 获取系统当前着色颜色
COLORREF colorizationColor;
DwmGetColorizationColor(&colorizationColor, nullptr);
// 为窗口设置着色颜色属性
DwmSetWindowAttribute(hwnd, DWMWA_COLORIZATION_COLOR, &colorizationColor, sizeof(colorizationColor));

// 设置颜色平衡(默认0即可,确保菜单跟随系统色调)
int colorBalance = 0;
DwmSetWindowAttribute(hwnd, DWMWA_COLORIZATION_COLOR_BALANCE, &colorBalance, sizeof(colorBalance));

3. 为菜单配置系统颜色属性

创建菜单后,通过SetMenuInfo让菜单继承系统主题颜色,无需自定义绘制:

HMENU hMenu = CreateMenu();
// 添加菜单项逻辑...

MENUINFO mi = {0};
mi.cbSize = sizeof(MENUINFO);
mi.fMask = MIM_STYLE | MIM_APPLYTOSUBMENUS;
mi.dwStyle = MNS_NOTIFYBYPOS | MNS_USESYSCOLORS; // 指定使用系统颜色
SetMenuInfo(hMenu, &mi);

// 将菜单绑定到窗口
SetMenu(hwnd, hMenu);

4. 响应系统主题变更消息

当系统切换深色/浅色模式时,窗口会收到相关消息,需要在消息处理函数中刷新菜单和窗口属性:

case WM_DWMCOLORIZATIONCOLORCHANGED:
{
    COLORREF colorizationColor = (COLORREF)wParam;
    DwmSetWindowAttribute(hwnd, DWMWA_COLORIZATION_COLOR, &colorizationColor, sizeof(colorizationColor));
    // 刷新菜单栏
    HMENU hMenu = GetMenu(hwnd);
    if (hMenu) DrawMenuBar(hwnd);
    break;
}
case WM_SETTINGCHANGE:
{
    if (lParam && wcscmp((LPCWSTR)lParam, L"ImmersiveColorSet") == 0)
    {
        BOOL value = TRUE;
        DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
        // 刷新菜单栏
        HMENU hMenu = GetMenu(hwnd);
        if (hMenu) DrawMenuBar(hwnd);
    }
    break;
}

注意事项

  • 以上操作均基于系统原生支持,无需自定义菜单绘制逻辑。
  • 确保程序运行在Windows 10 1809及以上版本,DWMWA_USE_IMMERSIVE_DARK_MODE从该版本开始提供支持。

内容的提问来源于stack exchange,提问作者Runt8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:18:21