Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 889 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 25:

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

Программирование кнопок

Кнопка btnOpen должна загружать файл, предназначенный для проигрывания. Воспользуемся стандартным диалогом открытия файла, предусмотренным в библиотеке FCL.

  • Поместите из вкладки Dialogs панели Toolbox компонент OpenFileDialog. Это невизуальный компонент (неотображаемый на форме на этапе проектирования, а размещаемый в подвале окна редактирования оболочки), поэтому его экземпляр можно создать двойным щелчком на пиктограмме компонента
  • Настройте объект диалога открытия файла в соответствии с таблицей через панель Properties, предварительно выделив его в подвале графического редактора
Свойства экземпляра класса OpenFileDialog организации стандартного диалога
Элемент Свойство   Значение
OpenFileDialog Name   openFilePlayer
Filter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Wave (Microsoft) (*.wav) |*.wav| 
Dialogic VOX ADPCM (*.vox) |*.vox| 
InterVoice (*.ivc) |*.ivc| 
Macintosh AIFF (*.aif,*.aiff,*.snd) |*.aif,*.aiff,*.snd| 
MP3 Audio (*.mp3) |*.mp3| 
NeXT/Sun (Java) File (*.ai,*.snd) |*.ai,*.snd| 
OggVorbis (*.ogg) |*.ogg|
Perfect Clarity Audio (*.pca) |*.pca|
QuickTime (*.mov) |*.mov|
Raw File (*.raw) |*.raw|
RealMedia (*.rm) |*.rm|
Sound Designer 1 (*.dig,*.sd) |*.dig,*.sd|
Video for Windows (*.avi) |*.avi|
Windows Media (*asf) |*asf|
Windows Media Audio (*.wma) |*.wma|
Windows Media Video (*.wmv) |*.wmv|
All Files (*.*) |*.*
FilterIndex   13

Свойство Filter предназначено для управления пользователем типом отображаемых файлов, а свойство FilterIndex устанавливает, какой фильтр появится первым при запуске окна. Фильтры в свойстве Filter следуют парами друг за другом " Название фильтра|шаблон_фильтра " и разделяются символом "Вертикальная черта".

Внимание!!! Если вы будете копировать значение свойства Filter прямо из этой таблицы, то предварительно нужно убрать все невидимые символы перевода на новую строку (например, в блокноте), которые здесь введены в целях форматирования. Строка фильтра должна быть непрерывной. В шаблонах_фильтране должно быть пробелов ни внутри, ни в окружении, иначе фильтр не сработает.

Создадим, как и в случае с калькулятором, один обработчик для всех размещенных ранее кнопок. Для этого выполните следующее...

  • Перейдите в режим дизайна для файла MediaPlayer.cs, выделите первую кнопку btnOpen и через панель Properties для события Click в поле его значений установите вручную имя обработчика btnClick
  • Разместите в созданном оболочкой обработчике следующий код
private void btnClick(object sender, System.EventArgs e)
    {
      Button btn = (Button) sender;// Явное приведение типов
      switch(btn.Name)
      {
        case "btnOpen":
          openFilePlayer.InitialDirectory = // Начальный каталог для фильтра
            System.IO.Directory.GetCurrentDirectory();// Каталог исполнимого файла
          openFilePlayer.ShowDialog();// Открываем диалог
          Player.FileName = openFilePlayer.FileName;// Передаем имя файла в плеер
          break;
      }
    }
Листинг 25.23. Код открытия стандартного диалога для загрузки файла
  • Подсоедините обработчик btnClick к остальным кнопкам. Для этого откройте панель Properties в режиме Events, выделите оставшиеся три кнопки вместе и через раскрывающийся список в поле значения свойства Click выберите обработчик btnClick
  • Дополните код обработчика btnClick так
private void btnClick(object sender, System.EventArgs e)
    {
      Button btn = (Button) sender;// Явное приведение типов
      switch(btn.Name)
      {
        case "btnOpen":
          openFilePlayer.InitialDirectory = // Начальный каталог для фильтра
            System.IO.Directory.GetCurrentDirectory();// Каталог исполнимого файла
          openFilePlayer.ShowDialog();// Открываем диалог
          Player.FileName = openFilePlayer.FileName;// Передаем имя файла в плеер
          break;
        case "btnPlay":
          Player.Play();
          break;
        case "btnStop":
          Player.Stop();
          break;
        case "btnRewind":
          Player.CurrentPosition = 0;
          break;
      }
    }
Листинг 25.24. Код обработчика btnClick для оставшихся кнопок

После завершения работы стандартного диалогового окна OpenFileDialog его свойство FileName либо содержит полное (вместе с путем) имя выбранного файла, либо пустую строку, если пользователь отказался от выбора.

Теперь мы готовы к испытанию формы. Запустите приложение и загрузите какой-нибудь звуковой- или видео файл (например, прилагаемый к данной работе в каталоге Source файл " WellWait - 02.AVI "). Поэкспериментируйте с кнопками - они все работают.

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

  1. Использовать операторы обработки исключений try...catch
  2. Блокировать кнопку btnPlay до тех пор, пока не будет загружен файл для проигрывания

Мы воспользуемся вторым способом. Для начального блокирования кнопки есть три пути:

  1. Установить свойство Enabled кнопки на этапе проектирования в состояние False
  2. Программно установить свойство Enabled кнопки в состояние false в конструкторе класса MediaPlayer
  3. Создать для формы обработчик события Load и разместить в нем код установки кнопки в недоступное состояние

Мы воспользуемся последним способом. При этом будем блокировать все кнопки, кроме btnOpen, чтобы лишний раз не вводить в заблуждение нашего дорогого пользователя.

  • Перейдите в режим View Designer формы, выделите форму щелчком на ее заголовке или через раскрывающийся список панели Properties, установите панель Properties в режим Events и создайте обработчик события Load формы двойным щелчком на поле значений этого события. Заполните обработчик следующим кодом
private void MediaPlayer_Load(object sender, System.EventArgs e)
    {
      btnPlay.Enabled = btnStop.Enabled = btnRewind.Enabled = false;
    }
Листинг 25.25. Код начальной блокировки кнопок в обработчике события Load

Здесь мы употребили сцепленную операцию присваивания.

Теперь нужно разблокировать кнопки после того, как будет загружен файл в проигрыватель. Для этого

  • Дополните обработчик btnClick следующим кодом
private void btnClick(object sender, System.EventArgs e)
    {
      Button btn = (Button) sender;// Явное приведение типов
      switch(btn.Name)
      {
        case "btnOpen":
          openFilePlayer.InitialDirectory = // Начальный каталог для фильтра
            System.IO.Directory.GetCurrentDirectory();// Каталог исполнимого файла
          openFilePlayer.ShowDialog();// Открываем диалог
          Player.FileName = openFilePlayer.FileName;// Передаем имя файла в плеер
          if(Player.FileName.Length > 0)
          {
            // Перебираем все дочерние элементы контейнера GroupBox
            foreach(Control obj in groupBox.Controls)
            {
              // Выделяем полное имя типа вместе с пространствами имен
              String str = obj.GetType().ToString();
              // Ищем позицию последней точки
              int pos = str.LastIndexOf('.');
              // Выделяем имя типа без пути
              str = str.Substring(pos + 1);
              if(str == "Button")
                obj.Enabled = true;
            }
          }
          break;
        case "btnPlay":
          Player.Play();
          break;
        case "btnStop":
          Player.Stop();
          break;
        case "btnRewind":
          Player.CurrentPosition = 0;
          break;
      }
    }
Листинг 25.26. Код разблокирования кнопок в обработчике btnClick класса MediaPlayer

В добавленном коде мы проверяем, что выбранное пользователем имя файла непустое (надо было все-таки поставить обработчик исключения, поскольку пользователь может выбрать файл, не подлежащий проигрыванию. Но пока хватит и этого!).

Родительские элементы, такие как Panel, GroupBox, TabControl, сама форма Form, имеют свойство Controls, которое является коллекцией и содержит ссылки на все помещенные на родительский элемент дочерние компоненты - наследники класса Control.

Мы перебираем в цикле foreach ( -для каждого ) все элементы коллекции GroupBox, находим среди них кнопки и устанавливаем их доступными. Здесь мы наворотили лишние проверки на тот случай, если кроме кнопок в контейнере GroupBox окажутся и элементы других типов, хотя на данном этапе кроме кнопок мы туда ничего не помещали.

  • Запустите проект и убедитесь, что все добавленные нами возможности управления работают правильно.