Настройка Полосы Прокрутки Windows Form
Я искал во всемирной паутине без правильного ответа.
в моем приложении Windows Form я хочу изменить ширину полосы прокрутки, которая принадлежит FlowLayoutPanel.
полоса прокрутки добавляется "автоматически", так как содержимое панели компоновки потока больше формы.
из того, что я нашел в интернете, это, кажется, сложнее.
есть ли решение этого?
Ура!
2 ответов
нет, нет способа изменить ширину полосы прокрутки, отображаемой на одном элементе управления (Хотя существует общесистемная настройка, которая повлияет на все полосы прокрутки во всех приложениях).
уродливая правда заключается в том, что элемент управления низкой полосой прокрутки намного сложнее, чем кажется. В основном, полосы прокрутки на FlowLayoutPanel
рисуются самой Windows (а не .NET Framework) из-за WS_HSCROLL
и/или WS_VSCROLL
окне стилей установите для управления за кулисами. The FlowLayoutPanel
не изменять или изменять, как эти полосы нарисованы. В отличие от других более продвинутых модификаций в WinForms, нет таких сообщений, которые мы можем отправить в процедуру окна элемента управления. И что еще хуже, полосы прокрутки рисуются в неклиентской области FlowLayoutPanel
, Что означает, что мы не можем просто переопределить его Paint
событие и дескриптор рисования полос прокрутки сами.
к сожалению, если вы действительно хотите настроить полосы прокрутки, вам придется скрыть встроенные полосы прокрутки и свернуть свои собственные. это не так сложно, как кажется, хотя, если вы готовы к этому. в этой статье на CodeProject обеспечивает хорошее пошаговое руководство по созданию собственного скина полоса прокрутки как элемент управления пользователя и использовать его в качестве замены в контрольном контейнере на ваш выбор.
ответ Коди Грея на 100% правильно, хотя я хотел добавить больше справочных материалов по этому вопросу.
фон
способ создания полос прокрутки Windows Forms с помощью окне стили WS_HSCROLL
и WS_VSCROLL
. Соответственно, эти стили отвечают за включение горизонтальной и вертикальной полос прокрутки для данного HWND
. Ан HWND
- это собственный дескриптор ресурса окно"", который в .NET lingo соответствует Control
.
думая с точки зрения Windows API, мы должны установить стили окон во время создания HWND
. Это делается с помощью вызова CreateWindow
, CreateWindowEx
или SetWindowLong
. Естественно, мы можем начать думать об использовании P / Invoke чтобы помочь нам, но это было бы довольно обременительно, поскольку это означает, что нам нужно будет повторно реализовать Windows Forms из царапать.
к счастью, Windows Forms предоставляет свойство,CreateParams
, который можно переопределить, чтобы указать точные стили окон, среди прочего Control
параметры создания. Это свойство, в свою очередь, используется платформой .NET framework для создания HWND
с соответствующими стилями, когда Control
инстанцируется.
настройка полосы прокрутки
замена функциональности Windows API для полосы прокрутки на самом деле проще чем это может показаться; однако это не очевидно (ну для меня в любом случае, мне пришлось просеять источник .NET, чтобы найти ответ). Для этого мы должны выбрать подходящий Control
наследовать, чтобы создать свой собственный пользовательский ScrollableControl. Если мы соблюдаем исходный код для System.Windows.Forms.ScrollableControl
, мы видим, что используются следующие стили:
CreateParams cp = base.CreateParams;
if (HScroll || HorizontalScroll.Visible) {
cp.Style |= NativeMethods.WS_HSCROLL;
}
else {
cp.Style &= (~NativeMethods.WS_HSCROLL);
}
if (VScroll || VerticalScroll.Visible) {
cp.Style |= NativeMethods.WS_VSCROLL;
}
else {
cp.Style &= (~NativeMethods.WS_VSCROLL);
}
Итак, короче говоря, когда мы расширяемся от ScrollableControl
, собственные горизонтальные и вертикальные полосы прокрутки включены на основе внутренняя логика. Мы могли бы получить доступ к ScrollableControl
's дескриптор окна, а затем вызов SetWindowLong
чтобы скрыть полосы прокрутки, однако, мы должны отслеживать все места, которые ScrollableControl
взаимодействует с API Windows. На самом деле, существует внутренняя функция Control.UpdateStylesCore()
это вызывается в зависимости от того, должны ли отображаться полосы прокрутки. Эта функция эффективно повторно применяет стили windows выше, и, вероятно, было бы лучше не бороться с ним. Было бы гораздо более чистым подходом держаться подальше от Windows API и расширяются непосредственно из Control
. Затем мы можем предоставить любой API, который мы хотим иметь.
это означает, что мы будем смотреть на повторную реализацию:
- обновление полос прокрутки для событий колесика мыши.
- обновление полос прокрутки на основе нажатия пользовательских кнопок полосы прокрутки и треков / больших пальцев.
- обновление полос прокрутки на основе добавления/удаления/перемещения / изменения размера дочерних элементов управления.
- создание автоматической прокрутки маржи.
- ограничения в клиентской области, влияющие на видимость полос прокрутки.
- и так далее...
альтернативно, простой подход может заключаться в создании нового UserControl
. Это позволит нам использовать конструктор Visual Studio для упрощения настройки кнопок и дорожек полосы прокрутки.
какой бы путь ни был выбран, необходимо будет посмотреть, как ScrollableControl
работает внутренне для того чтобы обеспечить удобное пользовательский опыт.