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
相关产品推荐
相关产品推荐

