Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 17:

Пользовательские элементы управления

Упражнение 3. Проектирование музыкальной кнопки SoundButton

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

Добавление компонента кнопки SoundButton в проект библиотеки
  • Закройте все окна редактора оболочки, выполнив команду Window/Close All Documents, чтобы они не мешали при выполнении нового упражнения
  • В панели Solution Explorer к узлу UserControls добавьте новый компонент с именем SoundButton
  • Откорректируйте заготовку файла SoundButton.cs следующим образом
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
    
using System.Media; // Для проигрывателя wav-файлов SoundPlayer
                    // и системного звука SystemSounds
    
namespace MyCompany.UserControls
{
    public partial class SoundButton : Button
    {
        public SoundButton()
        {
            InitializeComponent();
        }
    
        public SoundButton(IContainer container)
        {
            container.Add(this);
    
            InitializeComponent();
        }
    }
}
Листинг 17.5 . Откорректированная заготовка файла SoundButton.cs
Добавление свойств загрузки звука

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

  • Добавьте в конец класса SoundButton файла SoundButton.cs следующий код, определяющий свойства загрузки звука
// Создаем объект-проигрыватель как 
        // поле класса для управления звуком
        SoundPlayer soundPlayer = new SoundPlayer();
    
        // Свойство подключения звука к проигрывателю из файла
        public string WaveFile
        {
            get
            {
                // Что загружено для проигрывания
                return soundPlayer.SoundLocation;
            }
            set
            {
                // Подключить файл с диска или URL
                soundPlayer.SoundLocation = value;
            }
        }
    
        // Свойство подключения звука к проигрывателю из потока
        public System.IO.Stream WaveStream
        {
            get
            {
                // Вернуть ссылку на загруженный в поток файл
                return soundPlayer.Stream;
            }
            set
            {
                // Подключить файл к потоку
                soundPlayer.Stream = value;
                // Загрузить асинхронно (в фоновом режиме)
                soundPlayer.LoadAsync();
            }
        }
Листинг 17.6 . Код свойств загрузки звука в файле SoundButton.cs

В классе расширения кнопки мы создали объект класса SoundPlayer как поле, чтобы он был виден в членах этого класса - в свойствах и переопределенном методе. Свойства WaveFile и WaveStream настраивают объект проигрывания звука и загружают в него указанный в вызывающем коде звук для выполнения в асинхронном (фоновом) режиме в отдельном потоке. Для синхронного проигрывания звука нужно использовать метод Load(), который будет держать приложение, пока звук полностью не проиграется. Свойство WaveFile используется для проигрывания звука из отдельного файла, хранящегося на диске или в Web по URL -адресу.

Переопределение стандартного метода диспетчеризации щелчка на кнопке

Как и в случае с кнопкой BeepButton, перехватим событие щелчка на кнопке SoundButton в переопределенном виртуальном методе диспетчеризации библиотечного класса Control и запустим в нем проигрывание адресуемого в свойствах файла

  • Добавьте в конец класса SoundButton файла SoundButton.cs следующий код, переопределяющий виртуальный метод диспетчеризации OnClick() класса Control и запускающий проигрывание звука
// Переопределяем виртуальный метод класса Control,
        // чтобы начать проигрывание по щелчку на кнопке
        protected override void OnClick(EventArgs e)
        {
            // Если имя экземпляра кнопки - "Web", 
            // то вместо адресации к удаленному звуку
            // в Internet проигрываем стандартный звуковой
            // файл локального компьютера, встроенный
            // в класс SystemSounds библиотеки .NET Framework 
            if (this.Name.ToUpper() == "Web".ToUpper())
            {
                SystemSounds.Asterisk.Play();
                return;
            }
    
            // Загрузить асинхронно - в фоновом режиме.
            // Поток для кнопки Stream открывается 
            // один раз в конструкторе клиента
            if (this.Name.ToUpper() != "Stream".ToUpper())
                soundPlayer.LoadAsync();
    
            // Если загрузка закончена, то начинаем проигрывание
            if (soundPlayer.IsLoadCompleted)
                soundPlayer.Play();
            else
                MessageBox.Show("Проигрыватель пока не готов!");
    
            // Подняться до класса Control,
            // чтобы сгенерировать событие Click.
            // Но в этом упражнении не нужно,
            // поскольку не планируем создавать обработчики
            // (хотя можно и оставить незакомментированной)
            // base.OnClick(e);
        }
Листинг 17.7 . Код переопределенного метода диспетчеризации в файле SoundButton.cs
  • Перекомпилируйте библиотеку пользовательских элементов вызовом команды Rebuild через контекстное меню узла UserControls панели Solution Explorer

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

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?