netlib.narod.ru | < Назад | Оглавление | Далее > |
По своим функциям регулятор (track bar) очень похож на полосу прокрутки. С точки зрения программиста, единственная разница между ними заключается в том, что для регуляторов ориентация (горизонтальная или вертикальная) определяется свойством:
Свойства TrackBar (выборочно)
Тип | Свойство | Доступ |
Orientation | Orientation | Чтение/запись |
Определение перечисления Orientation коротко и ясно:
Перечисление Orientation
Член | Значение |
Horizontal | 0 |
Vertical | 1 |
Эксперименты с программой ColorScroll показали, что толщину полос прокрутки можно менять. Толщину регуляторов по умолчанию изменять нельзя, да в этом обычно нет необходимости. Регулятору, как правило, нужна минимальная толщина для отображения отметок. Если хотите поэкспериментировать с толщиной регулятора, присвойте свойству AutoSize значение false.
Свойства TrackBar (выборочно)
Тип | Свойство | Доступ | Описание |
bool | AutoSize | Чтение/запись | По умолчанию true |
По умолчанию свойство AutoSize равно true, а значит, ширина (для вертикальных регуляторов) или высота (для горизонтальных) будет неизменной независимо от свойства Size. По умолчанию для регуляторов свойство TabStop равно true (в отличие от полос прокрутки).
Класс TrackBar содержит те же свойства, что и ScrollBar, но значения по умолчанию для Maximum и LargeChange иные:
Свойства TrackBar (выборочно)
Тип | Свойство | Доступ | Описание |
int | Value | Чтение/запись | Изменяется от Minimum до Maximum |
int | Minimum | Чтение/запись | По умолчанию 0 |
int | Maximum | Чтение/запись | По умолчанию 10 |
int | SmallChange | Чтение/запись | По умолчанию 1 |
int | LargeChange | Чтение/запись | По умолчанию 5 |
Значение свойства Value для регуляторов просто и без затей изменяется от Minimum до Maximum без какой либо связи со свойством LargeChange. Это облегчает применение регуляторов в приложениях типа ColorScroll и затрудняет в приложениях, прокручивающих документы.
Хотя в вертикальных полосах прокрутки значения увеличиваются при сдвиге ползунка вниз, в вертикальных регуляторах значения увеличиваются при сдвиге ползунка вверх. Опять-таки существует разница между прокруткой документа и выбором значения.
Два дополнительных свойства позволяют управлять отметками на регуляторе:
Свойства TrackBar (выборочно)
Тип | Свойство | Доступ | Описание |
TickStyle | TickStyle | Чтение/запись | По умолчанию BottomRight |
int | TickFrequency | Чтение/запись | По умолчанию 1 |
С помощью свойства TickStyle можно указать, на какой стороне регулятора будут находиться отметки:
Перечисление TickStyle
Член | Значение | Описание |
None | 0 | Без отметок |
TopLeft | 1 | Отметки сверху для горизонтальных регуляторов и слева для вертикальных |
BottomRight | 2 | Отметки снизу для горизонтальных регуляторов и справа для вертикальных |
Both | 3 | Отметки с обеих сторон регуляторов |
Значением по умолчанию является BottomRight. Если установить TickFrequency в 1 (по умолчанию) и задать широкий диапазон для регулятора, все может кончиться тем, что отметки сольются в сплошной черный прямоугольник.
Немного более гибкими регуляторы делает возможность указать цвет фона или фоновое изображение:
Свойства TrackBar (выборочно)
Тип | Свойство | Доступ |
Color | BackColor | Чтение/запись |
Image | BackgroundImage | Чтение/запись |
Два важнейших события TrackBar называются так же, как и события, реализованные в ScrollBar:
События ScrollBar
Событие | Метод | Делегат | Аргументы |
ValueChanged | OnValueChanged | EventHandler | EventArgs |
Scroll | OnScroll | EventHandler | EventArgs |
Оба этих события делегированы обычному обработчику EventHandler. Для регуляторов события Scroll и ValueChanged всегда вызываются парами (сначала Scroll, затем ValueChanged), кроме тех случаев, когда свойству Value программно присваивается другое значение. В этом случае событие ValueChanged вызывается без соответствующего события Scroll.
Вот программа ColorScroll, переписанная с использованием регуляторов.
ColorTrackBar.cs
//---------------------------------------------- // ColorTrackBar.cs (C) 2001 by Charles Petzold //---------------------------------------------- using System; using System.Drawing; using System.Windows.Forms; class ColorTrackBar: Form { Panel panel; Label[] alabelName = new Label[3]; Label[] alabelValue = new Label[3]; TrackBar[] atrackbar = new TrackBar[3]; public static void Main() { Application.Run(new ColorTrackBar()); } public ColorTrackBar() { Text = "Color Track Bar"; Color[] acolor = { Color.Red, Color.Green, Color.Blue }; // Создание панели panel = new Panel(); panel.Parent = this; panel.Location = new Point(0, 0); panel.BackColor = Color.White; // Цикл для трех цветов for (int i = 0; i < 3; i++) { alabelName[i] = new Label(); alabelName[i].Parent = panel; alabelName[i].ForeColor = acolor[i]; alabelName[i].Text = "&" + acolor[i].ToKnownColor(); alabelName[i].TextAlign = ContentAlignment.MiddleCenter; atrackbar[i] = new TrackBar(); atrackbar[i].Parent = panel; atrackbar[i].Orientation = Orientation.Vertical; atrackbar[i].BackColor = acolor[i]; atrackbar[i].SmallChange = 1; atrackbar[i].LargeChange = 16; atrackbar[i].Minimum = 0; atrackbar[i].Maximum = 255; atrackbar[i].TickFrequency = 16; atrackbar[i].ValueChanged += new EventHandler(TrackBarOnValueChanged); alabelValue[i] = new Label(); alabelValue[i].Parent = panel; alabelValue[i].TextAlign = ContentAlignment.MiddleCenter; } Color color = BackColor; atrackbar[0].Value = color.R; // Генерируем событие ValueChanged atrackbar[1].Value = color.G; atrackbar[2].Value = color.B; OnResize(EventArgs.Empty); } protected override void OnResize(EventArgs ea) { base.OnResize(ea); int cx = ClientSize.Width; int cy = ClientSize.Height; int cyFont = Font.Height; panel.Size = new Size(cx / 2, cy); for (int i = 0; i < 3; i++) { alabelName[i].Location = new Point(i * cx / 6, cyFont / 2); alabelName[i].Size = new Size(cx / 6, cyFont); atrackbar[i].Height = cy - 4 * cyFont; atrackbar[i].Location = new Point((1 + 2 * i) * cx / 12 - atrackbar[i].Width / 2, 2 * cyFont); alabelValue[i].Location = new Point(i * cx / 6, cy - 3 * cyFont / 2); alabelValue[i].Size = new Size(cx / 6, cyFont); } } void TrackBarOnValueChanged(object obj, EventArgs ea) { for (int i = 0; i < 3; i++) if((TrackBar) obj == atrackbar[i]) alabelValue[i].Text = atrackbar[i].Value.ToString(); BackColor = Color.FromArgb(atrackbar[0].Value, atrackbar[1].Value, atrackbar[2].Value); } }
Как видите, разница между двумя программами не очень-то велика. Большая часть различий между полосами прокрутки и регуляторами отражена в коде, устанавливающем свойства TrackBar. В программе ColorTrackBar нет надобности устанавливать свойство TabStop, зато нужно устанавливать свойства Orientation и TickFrequency. Кроме того, программа пользуется преимуществами того, что цвет фона полос прокрутки можно менять, устанавливая свойство BackColor в красный, зеленый или синий. Метод OnResize реализован немного иначе, так как я решил оставить ширину полос по умолчанию.
netlib.narod.ru | < Назад | Оглавление | Далее > |