Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 25:

Пользовательский интерфейс Windows Forms для C#

Добавление к форме других элементов управления

Усовершенствуем схему управления медиаплеером. Задействуем возможности управления звуком и контроля позиции проигрывающей головки. Для этого нам понадобятся такие элементы управления вкладки All Widows Forms, как TrackBar ( ползунок ), CheckBox ( флажок ), ProgressBar ( индикатор процесса, индикатор прогресса ), TextBox ( текстовое поле ).

  • Сместите кнопку btnRewind влево на один уровень с кнопкой btnOpen и поместите на освободившееся справа место элемент CheckBox (один щелчок на CheckBox, затем щелчок внутри контейнера groupBox ). Этот элемент даст возможность пользователю отключать или включать звук при воспроизведении файла
  • Правее элемента CheckBox разместите в контейнере groupBox текстовое поле TextBox, которое мы будем использовать для отображения численного значения величины звука
  • Ниже разместите в контейнере groupBox элемент TrackBar для плавного регулирования звука

Теперь нужно настроить эти элементы управления. Начнем с элемента CheckBox. Этот элемент мы будем использовать для отключения звука плеера. Настройте его свойства так

Свойства элемента CheckBox для отключения звука
Свойство Значение
Name checkVolume
CheckAlign MiddleLeft
Image VOLUME01.ICO (возьмите из данной работы в каталоге Source. Используйте кнопку Import для радиокнопки Local resource )
ImageAlign BottomRight
Checked True
Text ПУСТО

Давайте сразу запрограммируем этот элемент. При каждом щелчке на элементе CheckBox изменяется его булево свойство CheckedCheckState ).

  • Создайте в панели Properties обработчик события CheckedChanged элемента checkVolume и добавьте в него следующий код
private void checkVolume_CheckedChanged(object sender, System.EventArgs e)
    {
      // Это наше извращение, можно сразу обращаться к checkVolume
      CheckBox check = (CheckBox) sender;
  
      // В каком состоянии оказался CheckBox
      if(check.CheckState == CheckState.Checked)
      {
        Player.Mute = false;
      }
      else
      {
        Player.Mute = true;
      }
    }
Листинг 25.27. Код управления отключением звука медиаплеера

Для плавного изменения звука мы воспользуемся элементом TrackBar. Свойства и методы элемента TrackBar аналогичны полосам прокрутки ScrollBar. Некоторые из них перечислены в таблице. Причем не все свойства элемента TrackBar доступны в режиме проектирования, зато все доступны в программном режиме на этапе выполнения.

Некоторые свойства элемента TrackBar, доступные в режиме View Designer
Свойство Пояснения
Value Главная регулируемая величина, определяющая текущее состояние головки бегунка. По умолчанию начальное значение равно значению свойства Minimum
SmallChange Минимальная дискретность изменения величины Value при управлении стрелками или перемещением головки бегунка с захватом мышью. По умолчанию установлено 1
LargeChange Максимальная дискретность изменения величины Value при нажатии клавиш PageUp или PageDown, или щелчках мышью на шкале элемента. По умолчанию установлено 5
Minimum Нижний предел значения Value. По умолчанию 0
Maximum Верхний предел значения Value. По умолчанию 10
TickFrequency Свойство целого типа, определяющее частоту делений на шкале ползунка. Расчитывается с использованием значений свойств Minimum и Maximum
TickStyle Определяет форму ползунка при отображении пользователю
  • Настройте свойства элемента TrackBar так
Свойства элемента TrackBar для регулирования величины звука
Свойство Значение
Name trackVolume
Location 8; 104
Size 272; 53
Minimum 0
Maximum 50
Orientation Horizontal
LargeChange 5
SmallChange 1
TickFrequency 5
TickStyle BottomRight
  • Присвойте элементу TextBox имя txtVolume

Элемент txtVolume будет только отображать числовое значение Volume плеера, поэтому запретим его редактирование пользователем.

  • Выделите элемент txtVolume и создайте через панель Properties для его события KeyPress обработчик, который заполните так
private void txtVolume_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
      // Запрещаем редактировать поле, кроме клавиши Del
      // и горизонтальных стрелок - они встроены в элемент
      e.Handled = true;
    }
Листинг 25.28. Запрет пользователю редактировать элемент txtVolume

Свойство Handled сообщает элементу, что все уже обработано и нужно успокоиться и ничего не делать. Элемент TrackBar имеет событие Scroll, которое происходит каждый раз, когда изменяется положение головки бегунка. Воспользуемся этим, чтобы менять численное значение величины Volume плеера.

  • Создайте для события Scroll элемента TrackBar обработчик, который заполните так
private const int maxVolume = 0;
    private const int minVolume = -5000;
    private void trackVolume_Scroll(object sender, System.EventArgs e)
    {
      TrackBar track = (TrackBar) sender;
      float minValue = track.Minimum;
      float maxValue = track.Maximum;
      float value = track.Value;
      // Формула линейного изменения свойства  Player.Volume
      // (самая простая, хотя можно вставить и нелинейный закон)
      Player.Volume = minVolume - 
        (int) ( (value - minValue) /(maxValue - minValue) 
                * minVolume );
      txtVolume.Text = Convert.ToString(Player.Volume);
    }
Листинг 25.29. Обработчик события Scroll элемента TrackBar

Теперь нужно установить начальные значения текстового поля и положения бегунка при первой загрузке формы

  • Добавьте в обработчик события Load формы, который мы уже создали раньше, следующий код
private void MediaPlayer_Load(object sender, System.EventArgs e)
    {
      btnPlay.Enabled = btnStop.Enabled = btnRewind.Enabled = false;
      txtVolume.Text = Convert.ToString(Player.Volume);// Отображаем величину звука
      trackVolume.Value = // Устанавливаем бегунок
        // Поскольку работаем с целыми, которые округляются,
        // то вначале умножаем, потом делим
        trackVolume.Minimum + (minVolume - Player.Volume)
        * (trackVolume.Maximum - trackVolume.Minimum) 
        / minVolume;
    }
Листинг 25.30. Код инициализации свойств элементов при загрузке формы

Чтобы не давать пользователю возможности оперировать элементом TrackBar при выключенном звуке, будем блокировать этот элемент, когда звук отключен.

  • Добавьте в обработчик checkVolume_CheckedChanged() следующий код блокирования ползунка
private void checkVolume_CheckedChanged(object sender, System.EventArgs e)
    {
      // Это наше извращение, можно сразу обращаться к checkVolume
      CheckBox check = (CheckBox) sender;
  
      // В каком состоянии оказался CheckBox
      if(check.CheckState == CheckState.Checked)
      {
        Player.Mute = false;
        trackVolume.Enabled = true;
      }
      else
      {
        Player.Mute = true;
        trackVolume.Enabled = false;
      }
    }
Листинг 25.31. Код блокирования ползунка при выключенном звуке

Теперь мы хотим сделать так, чтобы пользователь мог видеть по нашему интерфейсу, какая часть файла уже воспроизведена. Для этого используем индикатор прогресса (процесса) ProgressBar.

Есть еще альтернативный вариант - COM-индикатор Microsoft ProgressBar Control 6.0 (SP4). Этот индикатор можно загрузить на панель Toolbox точно также, как мы это делали для плеера.

Откройте вкладку панели Toolbox "Моя вкладка", которую мы создали ранее, щелкните на ней правой кнопкой мыши и выполните команду Coose Items. Установите в появившемся окне вкладку COM Components, найдите нужный элемент Microsoft ProgressBar Control 6.0 (SP4), отметьте его и нажмите кнопку OK. Теперь этот компонент можно помещать на форму обычным образом.

Некоторые свойства:

  • Scrolling - гладкий или прерывистый вид полосы
  • Min, Max - пределы изменения полосы
  • Value - текущее значение
  • Orientation - горизонтальное или вертикальное расположение полосы
  • Appearance, BorderStyle - внешний вид полосы
  • Поместите компонент ProgressBar в контейнер groupBox (щелчком там и там) и настройте через панель Properties его свойства так
Свойства элемента ProgressBar
Свойство Значение
Name progressBar
Location 16; 160
Size 256; 8

Здесь мы установили только интерфейсные свойства элемента, а существенные свойства по управлению элементом будем задавать программно.

  • Выровняйте интерфейсные элементы с применением панели инструментов Layout оболочки, чтобы панель имела на данном этапе примерно такой вид


  • Выделите элемент Player и на панели Properties в режиме Events найдите событие ReadyStateChange. Создайте двойным щелчком на поле значений этого события обработчик Player_ReadyStateChange(), который заполните так
private void Player_ReadyStateChange(object sender, AxMediaPlayer._MediaPlayerEvents_ReadyStateChangeEvent e)
    {
      progressBar.Minimum = 0;
      int maximum = progressBar.Maximum = (int)Player.Duration;
    }
Листинг 25.32. Обработчик события перезагрузки медиафайла

Этот обработчик будет срабатывать каждый раз при загрузке нового файла и устанавливать новые значения свойств диапазона индикатора прогресса в секундах.

  • Вновь выделите элемент Player и на панели Properties в режиме Events найдите событие PositionChange. Создайте двойным щелчком на поле значений этого события обработчик Player_PositionChange(), который заполните так
private void Player_PositionChange(object sender, AxMediaPlayer._MediaPlayerEvents_PositionChangeEvent e)
    {
      progressBar.Value = (int)Player.CurrentPosition;
    }
Листинг 25.33. Обработчик события изменения положения бегунка плеера

Если теперь запустить форму на выполнение, то можно заметить, что индикатор прогресса заполняется только при изменении позиции головки проигрывателя мышью. Нужен таймер, который бы регулярно заполнял состояние индикатора новыми значениями позиции головки.

  • Добавьте двойным щелчком во вкладке All Windows Forms на компоненте Timer таймер к нашей форме и назначьте ему имя timer
  • Создайте для его единственного события Tick обработчик, в котором продублируйте код обработчика Player_PositionChange(), обновляющий позицию элемента progressBar
private void timer_Tick(object sender, System.EventArgs e)
    {
      progressBar.Value = (int)Player.CurrentPosition;
//      progressBar.PerformStep();// Для альтернативного способа
    }
Листинг 25.34. Обработчик события таймера
  • Дополните обработчик Player_ReadyStateChange() события загруки медиафайла кодом настройки и запуска таймера
private int  countSteps;
    private void Player_ReadyStateChange(object sender, AxMediaPlayer._MediaPlayerEvents_ReadyStateChangeEvent e)
    {
      countSteps = 50; // Количество шагов индикатора прогресса
      progressBar.Minimum = 0;
      progressBar.Maximum = (int)Player.Duration;
      timer.Interval = (progressBar.Maximum - progressBar.Minimum) 
        * 1000 // Переводим секунды в миллисекунды
        / countSteps; // Операция деления на последнем месте
      timer.Start();
      progressBar.Value = progressBar.Minimum;
/*      // Для альтернативного способа
      progressBar.Step = (progressBar.Maximum - progressBar.Minimum) 
        / countSteps;
*/        
    }
Листинг 25.35. Настройка и запуск таймера при загрузке медиафайла

Красным цветом выделен альтернативный код управления интикатором. Но если вы его будете использовать, то нужно позаботиться об остановке таймера при каждой остановке проигрывания и о его запуске при продолжении проигравания. Если этого не сделать, то при остановке проигрывания индикатор будет продолжать показывать процесс, поскольку таймер не будет остановлен.

  • Выделите форму через ее заголовок и установите два свойства в следующие значения
    • FormBorderStyle=FixedSingle
    • MaximizeBox=False

Теперь осталось подключить эту форму к основному окну приложения и сделать необходимые настройки.

  • Создайте обработчик события FormClosed формы MediaPlayer, как мы это делали в предыдущих случаях данной работы для предотвращения повторного запуска, и заполните его так
private void MediaPlayer_FormClosed(object sender, System.EventArgs e)
    {
      Restart.Remove(this.ToString());
    }
Листинг 25.36. Обработчик события FormClosed формы MediaPlayer
  • Измените заголовок формы, задав ее свойству Text значение " Упражнение №3 - MediaPlayer "
  • Через панель Solution Explorer откройте файл Start.cs в режиме кода и добавьте к обработчику generalList_SelectedIndexChanged() следующий код
private void generalList_SelectedIndexChanged(object sender, System.EventArgs e)
    {
      switch(generalList.SelectedIndex + 1)
      {
      .................................................
        case 3:
          MediaPlayer frm3 = new MediaPlayer();
          if(!Restart.IsPresent(frm3))
          {
            Restart.Add(frm3);
            frm3.Show();
          }
          break;
      }
    }
Листинг 25.37. Код вызова формы MediaPlayer и предотвращения ее повторного запуска
  • Через панель Solution Explorer откройте файл Start.cs в режиме дизайна двойным щелчком на пиктограмме. Выделите через панель Properties список generalList и добавьте в его свойство Items следующую строку

    3) Собственный Windows Media Player

  • Командой меню оболочки Project/WinFormsApp Properties выберите вкладку Application и верните свойство Startup Object в значение WinFormsApp.Program
  • Запустите приложение, загрузите медиафайл, испытайте элементы управления и полюбуйтесь на свою работу. Просмотрите мультик, прилагаемый к работе


Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000