Пользовательский интерфейс Windows Forms для C#
Добавление к форме других элементов управления
Усовершенствуем схему управления медиаплеером. Задействуем возможности управления звуком и контроля позиции проигрывающей головки. Для этого нам понадобятся такие элементы управления вкладки All Widows Forms, как TrackBar ( ползунок ), CheckBox ( флажок ), ProgressBar ( индикатор процесса, индикатор прогресса ), TextBox ( текстовое поле ).
-
Сместите кнопку btnRewind влево на один уровень с кнопкой btnOpen и поместите на освободившееся справа место элемент CheckBox (один щелчок на CheckBox, затем щелчок внутри контейнера groupBox ). Этот элемент даст возможность пользователю отключать или включать звук при воспроизведении файла
-
Правее элемента CheckBox разместите в контейнере groupBox текстовое поле TextBox, которое мы будем использовать для отображения численного значения величины звука
-
Ниже разместите в контейнере groupBox элемент TrackBar для плавного регулирования звука
Теперь нужно настроить эти элементы управления. Начнем с элемента CheckBox. Этот элемент мы будем использовать для отключения звука плеера. Настройте его свойства так
Давайте сразу запрограммируем этот элемент. При каждом щелчке на элементе CheckBox изменяется его булево свойство Checked (и CheckState ).
-
Создайте в панели 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 так
-
Присвойте элементу 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 плеера.
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. Теперь этот компонент можно помещать на форму обычным образом.
Некоторые свойства:
-
Поместите компонент ProgressBar в контейнер groupBox (щелчком там и там) и настройте через панель Properties его свойства так
Здесь мы установили только интерфейсные свойства элемента, а существенные свойства по управлению элементом будем задавать программно.
-
Выровняйте интерфейсные элементы с применением панели инструментов 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 следующую строку
-
Командой меню оболочки Project/WinFormsApp Properties выберите вкладку Application и верните свойство Startup Object в значение WinFormsApp.Program
-
Запустите приложение, загрузите медиафайл, испытайте элементы управления и полюбуйтесь на свою работу. Просмотрите мультик, прилагаемый к работе