5

当每个监视器的 DPI 更改(WM_DPICHANGED消息)时,列表视图、树视图、富编辑、列表框等控件的内置滚动条不会缩放(如预期的那样)。

未缩放的滚动条

它们需要以编程方式进行扩展。

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

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

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


有关背景信息,请参阅Windows 上的高 DPI 桌面应用程序开发


有几个看似重复的问题,但实际上没有一个是相关的:

那里的答案要么更改系统范围的设置,要么DataGrid仅适用于(在其界面中具有单独的子滚动条控件)。

4

2 回答 2

3

滚动条通常不是单独的窗口。如果窗口使用WS_HSCROLL/WS_VSCROLL样式,则滚动条在控件本身的非客户区中实现。

Windows 10 Creators Update 将引入一种称为Per Monitor V2 DPI 意识的功能。这包括子窗口通知、“Windows 窗体 DPI 缩放改进”和“改进的主题行为”。它还将自动扩展非客户区。

与此同时,您可以尝试拨打电话(在周年纪念更新中添加EnableNonClientDpiScaling)。WM_NCCREATE

于 2017-03-08T17:22:59.430 回答
2

正如@Anders 所建议的,Windows 10 Creators Update 中的 Per Monitor V2 DPI 感知解决了这个问题。

缩放控件滚动条

要启用 Per Monitor V2 DPI 感知,同时仍支持旧 Windows 10 版本上的旧 Per Monitor DPI 感知以及 Windows 8.1 和旧版本 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>

参考:

于 2017-04-05T11:35:48.007 回答