Setting/scaling 控件滚动条的宽度

Setting/scaling width of control scrollbars

当 per-monitor DPI 更改 (WM_DPICHANGED message) 时,列表视图、树视图、丰富的编辑、列表框等控件的 built-in 滚动条未缩放(如预期)。

它们需要以编程方式进行缩放。

虽然我没有找到任何 API(在 Win32 中也没有,只在 WinForms 中)来设置滚动条大小。

我可以使用什么 API 来设置滚动条大小(宽度)?

或者至少我是如何获得滚动条句柄的? (我假设滚动条在内部是单独的子控件)一旦我有了句柄,我假设我可以使用 MoveWindow 来调整它的大小 (编辑:我的假设是不正确的,正如@Anders 的回答显示)


有关背景,请参阅 High DPI Desktop Application Development on Windows


有几个看似重复的问题,但其中 none 个实际上是相关的:

那里的答案要么更改 system-wide 设置,要么仅适用于 DataGrid(在其界面中有单独的子滚动条控件可用)。

滚动条 usually 不是独立的 windows。如果 window 使用 WS_HSCROLL/WS_VSCROLL 样式,则滚动条在控件本身的非客户区实现。

Windows 10 创意者更新将引入一个叫做 Per Monitor V2 DPI awareness 的东西。这包括子 window 通知、"Windows Forms DPI scaling improvements" 和 "Improved theming behavior"。它还将自动缩放非客户区。

在此期间,您可以尝试拨打 EnableNonClientDpiScaling in WM_NCCREATE (added in the Anniversary Update).

根据@Anders 的建议,Windows 10 Creators Update 中的 Per Monitor V2 DPI 意识解决了这个问题。

启用 Per Monitor V2 DPI 感知,同时仍然支持旧 Windows 10 版本和 Windows 8.1 上的旧 Per Monitor DPI 感知,以及更旧版本 Windows 上的 DPI 感知,使您的应用程序清单如下:

<assembly ...>
    <!-- ... --->
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>True/PM</dpiAware>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness>
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>

参考文献: