【发布时间】: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