| Украина, Киев |
Пользовательские элементы управления
Тестирование пользовательских элементов BeepButton и MyDialogBox
-
Добавьте
к решению MySolution новый проект с именем Test типа Windows
Application. Для этого выполните команду меню оболочки File/Add/New
Project и заполните окно мастера примерно так
-
В панели Solution
Explorer выделите узел
проекта Test и назначьте его стартовым командой Project/Set
as StartUp Project меню оболочки или аналогичной
командой контекстного меню -
Выделите
форму Form1 и настройте ее свойства
как показано в таблице
| Свойство | Значение | Пояснения |
|---|---|---|
| Text | Кнопка со звуком | Заголовок тестового окна |
| StartPosition | CenterScreen | Открывать в центре экрана |
-
Поместите
из панели Toolbox на верхнюю часть формы
экземпляр textBox1 текстового поля TextBox
-
Поместите
из панели Toolbox на середину формы разработанную
нами кнопку BeepButton и настройте ее
в соответствии с таблицей
| Свойство | Значение | Пояснения |
|---|---|---|
| AutoSize | true | Подстраиваться под содержимое |
| Text | Звукнуть | Надпись |
| Location | 100; 100 | Позиционировали |
-
Для
выделенного экземпляра кнопки BeepButton переведите
панель Properties оболочки в режим Events и
в поле события Click задайте
имя обработчика ButtonOnClick
-
Заполните
обработчик кодом вызова нашего диалогового окна MyDialogBox так
private void ButtonOnClick(object sender, EventArgs e)
{
string msg;
if (textBox1.Text.Trim().Length == 0)
msg = "Щелкнули на кнопке";
else
msg = textBox1.Text.Trim();
// Запускаем наше диалоговое окно статическим методом
MyDialogBox.Show(msg, this.Text);
}
Листинг
19.5.
Обработчик события Click звуковой кнопки BeepButton
-
Добавьте
в начало файла Form1.cs строку кода подключения пространства
имен нашей библиотеки элементов
для того, чтобы иметь возможность написать сокращенное имя класса MyDialogBox
-
Выполните
приложение и получите примерно такой результат
В производном от кнопки классе BeepButton мы только переопределили виртуальный метод OnClick(), в который встроили вызов звукового сигнала. В вызывающем коде тестового приложения, использующем экземпляр класса расширения кнопки, мы подписались на событие Click, чтобы щелчок на кнопке запускал самодельное диалоговое окно.
Но мы этот метод перехватили в нашем расширении, и если не предусмотреть передачу вызова base.OnClick(e) дальше по цепочке наследования в класс Control, то событие Click инициировано не будет и наш зарегистрированный обработчик ButtonOnClick() никогда не сработает. А значит и наше диалоговое окно вызываться не будет (попробуйте закоментировать вызов base.OnClick(e) в файле BeepButton.cs ).
Таким образом, в переопределенном методе OnClick(), который срабатывает автоматически при щелчке на кнопке, вызывается звуковой сигнал. А при вызове этого метода в базовом классе генерируется событие Click, которое заставляет выполниться все зарегистрированные для него обработчики. В нашем случае это один обработчик, косвенно запускающий самодельное диалоговое окно. Метод OnClick() для кнопок вызывается и в тех случаях, когда кнопка имеет текущий фокус ввода и нажимается клавиша Enter или Space (пробел).
Если в переопределенном методе OnClick() класса BeepButton поменять местами строки вызова звука и события Click, то звук появится только после закрытия диалогового окна (попробуйте).
Обратите внимание, что при формировании интерфейса диалогового окна мы не расставляли по форме кнопку и текстовую метку. Но за счет применения библиотечного компонента FlowLayoutPanel эти элементы на этапе выполнения позиционируются автоматически.

