Установка / масштабирование ширины полос прокрутки управления

При изменении DPI монитора (WM_DPICHANGED сообщение) встроенные полосы прокрутки таких элементов управления, как представление списка, представление дерева, расширенное редактирование, окно списка, не масштабируются (как и ожидалось).

Немасштабированная полоса прокрутки

Их нужно масштабировать программно.

Хотя я не нашел API (ни в Win32, ни только в WinForms) для установки размера полосы прокрутки.

Какой API можно использовать для установки размера (ширины) полосы прокрутки?

Или, по крайней мере, как мне достать ручку полосы прокрутки? (Я предполагаю, что внутри полосы прокрутки являются отдельными дочерними элементами управления). Как только я получу дескриптор, я предполагаю, что могу использовать _ 2_, чтобы изменить его размер (Изменить: мое предположение было неверным, как показывает ответ @Anders)


Для справки см. Разработка настольных приложений с высоким разрешением для Windows.


Есть пара, казалось бы, повторяющихся вопросов, но на самом деле ни один из них не имеет отношения к делу:

Ответы там либо изменяют общесистемные настройки, либо работают только для DataGrid (в интерфейсе которых доступны отдельные дочерние элементы управления полосой прокрутки).


person Martin Prikryl    schedule 08.03.2017    source источник
comment
Что произойдет, если вы перенаправите WM_DPICHANGED дочерним окнам? Что произойдет, если вы вызовете SetWindowPos(SWP_FRAMECHANGED) в дочерних окнах? Я не знаю, правильный ли один из этих ответов, но это было бы первое, что я бы попробовал ... (мне нужно перечитать страницы MSDN по осведомленности о DPI.)   -  person andlabs    schedule 08.03.2017
comment
@andlabs Спасибо за ваш комментарий. Я пробовал оба (каким бы неправдоподобным ни было первое, поскольку документация не подразумевает, что сообщение должно когда-либо обрабатываться элементами управления). К сожалению, ни один из них не имеет никакого эффекта.   -  person Martin Prikryl    schedule 08.03.2017


Ответы (2)


Полосы прокрутки - это обычно не отдельные окна. Если окно использует стили _1 _ / _ 2_, тогда полосы прокрутки реализованы в неклиентской области самого элемента управления.

Windows 10 Creators Update представит нечто под названием Поддержка DPI для монитора V2. Сюда входят уведомления дочерних окон, «Улучшения масштабирования DPI в Windows Forms» и «Улучшенное поведение тем». Он также будет автоматически масштабировать неклиентскую область.

А пока вы можете попробовать позвонить EnableNonClientDpiScaling в WM_NCCREATE (добавлен в юбилейное обновление).

person Anders    schedule 08.03.2017
comment
+1 Спасибо! Я уже звоню в EnableNonClientDpiScaling. Это не влияет на элементы управления. - Я могу дождаться обновления Creators Update, прежде чем реализовывать это. - Хотя я все еще ожидаю, что решение должно быть даже для текущей сборки Windows. Поскольку встроенные окна (например, стандартное окно открытия файла) масштабируют полосы прокрутки. - person Martin Prikryl; 08.03.2017

Как было предложено @Anders, осведомленность о DPI для монитора V2 в Windows 10 Creators Update решает эту проблему.

Масштабируемая полоса прокрутки элемента управления

Чтобы включить осведомленность о DPI на мониторе V2, при этом поддерживая прежнюю осведомленность о DPI на мониторе в старых сборках Windows 10 и Windows 8.1 и осведомленность о DPI в еще более старых версиях Windows, сделайте ваше приложение манифестом следующим образом:

<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>

Использованная литература:

person Martin Prikryl    schedule 05.04.2017