将深色卷轴分配给CMFCPropertyGrid

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

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

i在我的测试项目中实现了

FixDarkScrollBars

功能。好消息是它适用于我的对话的99%:

enter image description here唯一仍然具有轻卷轴的控制是CMFCPropertyGrid

。这是

FixDarkScrollBar

void FixDarkScrollBar()
{
    HMODULE hComctl = LoadLibraryExW(L"comctl32.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
    if (hComctl)
    {
        auto addr = FindDelayLoadThunkInModule(hComctl, "uxtheme.dll", 49); // OpenNcThemeData
        if (addr)
        {
            DWORD oldProtect;
            if (VirtualProtect(addr, sizeof(IMAGE_THUNK_DATA), PAGE_READWRITE, &oldProtect))
            {
                auto MyOpenThemeData = [](HWND hWnd, LPCWSTR classList) -> HTHEME {
                    if (wcscmp(classList, L"ScrollBar") == 0)
                    {
                        hWnd = nullptr;
                        classList = L"Explorer::ScrollBar";
                    }
                    return _OpenNcThemeData(hWnd, classList);
                };

                addr->u1.Function = reinterpret_cast<ULONG_PTR>(static_cast<fnOpenNcThemeData>(MyOpenThemeData));
                VirtualProtect(addr, sizeof(IMAGE_THUNK_DATA), oldProtect, &oldProtect);
            }
        }
    }
}

使用间谍++
Spy++确认垂直卷轴具有

ScrollBar

类名称。

这与
FixDarkScrollbar

函数一致,在该功能中寻找该类名称:
  • if (wcscmp(classList, L"ScrollBar") == 0)
    
  • 还可以预期,因为
CMFCPropertyGridCtrl::GetScrollBarCtrl
    函数返回a
  • CScrollBar
        
    发现有一个简单的解决方案。在我的问题的评论中,我鼓励我查看原始的MFC源控制(
    afxproperygridctrl.h
  • ),我可以看到它具有滚动条成员变量:
c++ mfc scrollbar darkmode cmfcpropertygridctrl
1个回答
0
投票

垂直工具栏是在

Init
函数中创建的:

m_wndScrollVert.Create(WS_CHILD | WS_VISIBLE | SBS_VERT, rectDummy, this, AFX_ID_SCROLL_VERT);

,我以为我会回到基础知识:

auto pScrollBar = m_gridCtrl.GetScrollBarCtrl(SB_VERT);
if (pScrollBar)
{
    SetWindowTheme(pScrollBar->GetSafeHwnd(), DarkModeTools::szDarkMode_Explorer, nullptr);
}

,瞧!

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