【问题标题】:Setting/scaling width of control scrollbars设置/缩放控件滚动条的宽度
【发布时间】:2017-07-29 04:59:08
【问题描述】:

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

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

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

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

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


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


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

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

【问题讨论】:

  • 如果将WM_DPICHANGED 转发到子窗口会发生什么?如果您在子窗口上调用SetWindowPos(SWP_FRAMECHANGED) 会发生什么?我不知道这是否是正确的答案,但这些将是我会尝试的第一件事......(我需要重新阅读有关 DPI 意识的 MSDN 页面。)
  • @andlabs 感谢您的评论。我都试过了(但第一个似乎难以置信,因为文档并不暗示消息应该由控件处理)。不幸的是,两者都没有任何效果。

标签: winforms listview winapi scrollbar dpi-aware


【解决方案1】:

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

Windows 10 创意者更新将引入名为 Per Monitor V2 DPI awareness 的内容。这包括子窗口通知、“Windows 窗体 DPI 缩放改进”和“改进的主题行为”。它还将自动缩放非客户区。

与此同时,您可以尝试在WM_NCCREATE (added in the Anniversary Update) 中调用EnableNonClientDpiScaling

【讨论】:

  • +1 谢谢!我已经打电话给EnableNonClientDpiScaling。这不会影响控件。 - 在实施此之前,我可能会等待“创作者更新”。 - 虽然我仍然希望即使是当前的 Windows 版本也应该有解决方案。由于内置窗口(例如标准的“打开文件”窗口)会缩放滚动条。
【解决方案2】:

正如@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>

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多