控制滚动条的设置/缩放宽度

时间:2017-03-08 14:50:55

标签: winforms listview winapi scrollbar dpi-aware

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

Unscaled scrollbar

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

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

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

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

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

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

那里的答案要么改变系统范围的设置,要么只为success: function(data) { this.setState({ movies: [data] }, function() { console.log(data); }) }.bind(this), 工作(在其界面中有单独的子滚动条控件)。

2 个答案:

答案 0 :(得分:3)

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

Windows 10 Creators Update将引入名为Per Monitor V2 DPI awareness的内容。这包括子窗口通知,“Windows窗体DPI扩展改进”和“改进主题行为”。它还将自动扩展非客户区域。

在此期间,您可以尝试在WM_NCCREATEEnableNonClientDpiScaling)中致电added in the Anniversary Update

答案 1 :(得分:2)

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

Scaled control scrollbar

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

参考文献: