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 реализован немного иначе, так как я решил оставить ширину полос по умолчанию.


Рис. 12.20.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz