我正在查看这个 GitHub 项目:
https://github.com/ysc3839/win32-darkmode
指的是使用未公开的API在Win32项目中使用深色模式(如果操作系统是某个版本)。
我发现它可以工作,但不适用于状态栏(和其他一些控件)。我试过:
SetWindowTheme(m_StatusBar.GetSafeHwnd(), L"DarkMode_Explorer", nullptr);
但这没有什么区别:
我遇到问题的控件是:
为了完整性,我包含了我的
OnCtlColor
处理程序(如果有帮助的话):
HBRUSH CResizingDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = __super::OnCtlColor(pDC, pWnd, nCtlColor);
if (theApp.GetNumberSetting(L"Options", L"Theme_UseDarkMode", false))
{
constexpr COLORREF darkBkColor = 0x383838;
constexpr COLORREF darkTextColor = 0xFFFFFF;
// Return a solid brush with the dark background color
static HBRUSH hbrBackground = CreateSolidBrush(RGB(45, 45, 45));
hbr = hbrBackground;
// If you need to customize specific controls, add conditions
switch (nCtlColor)
{
case CTLCOLOR_DLG: // Dialog background
case CTLCOLOR_STATIC: // Static text
case CTLCOLOR_EDIT: // Edit control
case CTLCOLOR_LISTBOX: // Listbox
pDC->SetTextColor(darkTextColor); // Light text
pDC->SetBkColor(darkBkColor); // Dark background
break;
break;
case CTLCOLOR_SCROLLBAR: // Scrollbars
case CTLCOLOR_BTN: // Buttons
default:
// You can add specific cases here if needed
break;
}
}
return hbr;
}
据我了解,微软仅针对他们在 Windows 不同部分使用的控件实现了深色主题支持。因此,我不希望深色主题本身适用于日历或时间选择器等控件。我们的解决方案是使用Microsoft Detours拦截
GetThemeColor
和DrawThemeText
等API,替换颜色并调用原始函数。例如,它可以与复选框和单选按钮控件配合使用,但我们从未为您可能需要的其他控件实现解决方法。您可以查看我们的开源项目:https://github.com/SFTRS/DarkTaskDialog