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

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

Подготовка файлов звука к проигрыванию компонентом SoundButtonBox

Присоединим адресуемые звуки к проекту нашей библиотеки компонентов UserControls.

Первый звук: Первый звук tada.wav хранится в системном каталоге Windows и путь к нему мы формируем с использованием библиотечного класса Environment.

Второй звук: Второй звук SOUND827.WAV (или любой другой) код компонента ищет в каталоге размещения самой сборки. Для того, чтобы он там оказался, выполните следующее:

  • В панели Solution Explorer выделите узел проекта UserControls и командой оболочки Project/Add Existing Item загрузите нужный файл в каталог проекта. Файл будет скопирован в каталог размещения проекта (звук SOUND827.WAV находится в прилагаемом к данной работе каталоге Source )

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

  • В панели Solution Explorer вызовите контекстное меню для скопированного файла звука SOUND827.WAV и выполнить команду Properties. Установите опцию Copy to Output Directory в значение Copy if newer (копировать при обновлении файла звука) или Copy always (копировать всегда). Теперь оболочка сама при компиляции проекта разместит файл в одном со сборкой компонента каталоге

Третий звук: Свойство WaveStream используется для проигрывания звука, присоединенного к исполняемому файлу как внедренный ресурс. Файл Trumpet1.wav внедряемого как ресурс звука нужно добавить к проекту, а затем настроить его свойства так, чтобы компилятор поместил его в сборку компонента.

  • В панели Solution Explorer выделите узел проекта UserControls и командой Add/Add Existing Item контекстного меню загрузите файл Trumpet1.wav в каталог проекта из прилагаемого к работе каталога Source
  • Через команду Properties контекстного меню, вызванного в панели Solution Explorer для файла Trumpet1.wav, установите в таблице свойств Properties поле Build Action в значение Embedded Resource (назначить внедренным ресурсом)

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

Четвертый звук: Специальных подготовительных действий не требует, поскольку извлекается из библиотеки .NET Framework.

  • Откомпилируйте проект с компонентами, выполнив команду Rebuild контекстного меню узла UserControls в панели Solution Explorer
  • Запустите проводник Windows Explorer и убедитесь, что размер сборки UserControls существенно увеличился за счет внедренного звука Trumpet1.wav.

Тестирование компонента SoundButtonBox

  • Добавьте к решению командой File/Add/New Project новый проект типа оконного приложения ( Windows Application ) с именем SoundButtonsTest и назначьте его стартовым командой Project/Set as StartUp Project меню оболочки (или аналогичной командой контекстного меню)
  • Поместите на форму из панели Toolbox экземпляр компонента SoundButtonBox и выровняйте его по размеру формы
  • Подключите динамики, запустите приложение и испытайте его работу

Отметьте, что разные исполнимые сборки используют одну и ту же библиотеку компонентов UserControls.dll при условии, что эта библиотека находится в том же каталоге, что и исполнимая сборка. При добавлении к нашему решению MySolution, содержащему проект библиотеки компонентов UserControls, нового проекта SoundButtonsTest исполнимого приложения оболочка автоматически копирует эту библиотеку в каталог, где будет находиться исполнимая сборка. При любом изменении библиотеки компонентов при ее компиляции оболочка обновляет файл библиотеки во всех каталогах, где находятся файлы исполнимых сборок.

Упражнение 4. Рисование круглой кнопки

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

Вид стандартного элемента управления можно изменить, переопределив его виртуальные методы OnPaint() и OnResize(). Предпочтимые размеры элемента управления устанавливаются в переопределении наследуемого метода GetPreferredSize(). Для прорисовки элементов управления можно использовать класс System.Windows.Forms. ControlPaint. Системная палитра, перья и кисти находятся в трех классах пространства имен System. Drawing:

  • SystemColors
  • SystemPens
  • SystemBrushes

Пространство имен System.Windows.Forms также содержит цвета в классах

  • ProfessionalColors - цвета в статических свойствах класса
  • ProfessionalColorTable - цвета в виртуальных экземплярных свойствах класса

Создание заготовки компонента CircleButton

  • В панели Solution Explorer выделите узел UserControls и добавьте к проекту библиотеки новый компонент командой Project/Add Component с именем CircleButton
  • В заголовке класса CircleButton файла CircleButton.cs замените базовый класс Component на Button
  • Добавьте в начало файла CircleButton.cs инструкции подключения пространств имен using System.Drawing; using System.Windows.Forms;
  • Добавьте в класс CircleButton закрытый метод Init() и поместите его вызовы в перегруженные конструкторы компонента
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
    
using System.Drawing;
using System.Windows.Forms;
    
namespace MyCompany.UserControls
{
    public partial class CircleButton : Button
    {
        public CircleButton()
        {
            InitializeComponent();
    
            Init();
        }
    
        public CircleButton(IContainer container)
        {
            container.Add(this);
    
            InitializeComponent();
    
            Init();
        }
    
        // Начальные настройки для выполнения в конструкторе
        private void Init()
        {
            // Извещаем операционную систему, что будем сами
            // заботиться об отрисовке компонента
            this.SetStyle(ControlStyles.UserPaint, true);
    
            // Игнорировать системное сообщение WM_ERASEBKGND 
            // очистки окна, чтобы уменьшить нежелательное мерцание 
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    
            // Наружный отступ по контуру кнопки
            this.Margin = new Padding(this.Font.Height);
    
            // Подстраиваться под размер надписи
            this.AutoSize = true;
        }
    }
}
Листинг 19.11. Установка стилей отрисовки в файле CircleButton.cs

Установка флага ControlStyles.UserPaint извещает операционную систему, что отрисовка окна компонента будет выполняться в переопределении его метода OnPaint().

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