为 Win32 状态栏使用深色模式

问题描述 投票:0回答:1

我正在查看这个 GitHub 项目:

https://github.com/ysc3839/win32-darkmode

指的是使用未公开的API在Win32项目中使用深色模式(如果操作系统是某个版本)。

我发现它可以工作,但不适用于状态栏(和其他一些控件)。我试过:

SetWindowTheme(m_StatusBar.GetSafeHwnd(), L"DarkMode_Explorer", nullptr);

但这没有什么区别:

enter image description here

我遇到问题的控件是:

  • 菜单栏
  • 工具栏
  • 复选框
  • 分组框
  • 组合 - 下拉列表
  • 日期选择器
  • 日历
  • 属性网格

为了完整性,我包含了我的

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;
}
visual-c++ statusbar darkmode
1个回答
0
投票

据我了解,微软仅针对他们在 Windows 不同部分使用的控件实现了深色主题支持。因此,我不希望深色主题本身适用于日历或时间选择器等控件。我们的解决方案是使用Microsoft Detours拦截

GetThemeColor
DrawThemeText
等API,替换颜色并调用原始函数。例如,它可以与复选框和单选按钮控件配合使用,但我们从未为您可能需要的其他控件实现解决方法。您可以查看我们的开源项目:https://github.com/SFTRS/DarkTaskDialog

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.