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

原文 标签 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



有几个看似重复的问题,但实际上都不相关:


Winforms - Adjust width of vertical scrollbar on CheckedListBox
Change width of scrollbars


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

最佳答案

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

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

同时,您可以尝试在EnableNonClientDpiScalingWM_NCCREATE)中调用added in the Anniversary Update

相关文章:

android - ListView保存状态复选框

java - 如何基于JavaFX中的条件设置列表 View 单元格的样式

delphi - GlobalFree-不兼容的类型:“NativeUInt”和“PWideChar”

winapi - Windows服务应用程序如何用Haskell编写?

c# - C#获取带有光标的图片框中的像素?

c# - 从Windows窗体中删除控件并调整其他控件以适合

c# - MDI利弊

.net - .NET桌面应用程序的好例子

android - 不要在listview中停止动画

c++ - 转换PID到HWND