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

Создание оконных приложений Windows Forms

Новая подписка в производном классе на унаследованные события

Подпишемся в производном классе на те же самые события и определим для них новые обработчики. Все это выполним в конструкторе производного класса. Обработчики базового класса переименуем. Новый код будет таким

using System;
using System.Windows.Forms;
using System.Drawing;
    
namespace MyApp
{
    // Наследует библиотечному классу
    class MyForm : Form
    {
        // Конструктор с настройками
        public MyForm()
        {
            // Начальная настройка окна
            this.Text = "Подписка событий";
            this.BackColor = SystemColors.Window;
            this.StartPosition = FormStartPosition.CenterScreen;
    
            // Подписка на события окна
            this.Click += new EventHandler(OnClick);
            // Альтернативный синтаксис подписки
            this.Resize += OnResize;
        }
    
        // Обработчик события создан,
        // но класс на него не подписался
        public virtual void OnClick(object sender, EventArgs e)
        {
            MessageBox.Show("Выполнен одиночный щелчок!", 
                            "Класс MyForm");
        }
    
        public virtual void OnResize(object sender, EventArgs e)
        {
            MessageBox.Show("Размеры окна изменены!", 
                            "Класс MyForm");
        }
    }
    
    // Наследует пользовательскому (нашему) классу
    class MyDerivedForm : MyForm
    {
        public MyDerivedForm()
        {
            // Новая подписка на те же события
            this.Click += MyClick;
            this.Resize += MyResize;
        }
    
        public void MyClick(object sender, EventArgs e)
        {
            MessageBox.Show("Выполнен одиночный щелчок!", 
                            "Класс MyDerivedForm");
        }
    
        public void MyResize(object sender, EventArgs e)
        {
            MessageBox.Show("Размеры окна изменены!", 
                            "Класс MyDerivedForm");
        }
    }
}
Листинг 6.11 . Код файла MyForm.cs
using System.Windows.Forms;
// Лишние пространства имен удалили
    
namespace MyApp
{
    class EntryPoint
    {
        public static void Main()
        {
            Application.Run(new MyDerivedForm());
        }
    }
}
Листинг 6.12 . Код файла Program.cs

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

Если сделать обработчики базового класса пустыми, то при возникновении соответствующего события их действия будут никакими, а проявят себя только подписанные обработчики производного класса. И наоборот, если не подписываться на события в производном классе, а перегрузить в нем пустые обработчики тех же событий, подписанные в базовом классе, то опять сработают обработчики производного класса.

Таким образом у нас есть два пути реагировать на события в производном классе: либо явно подписаться на унаследованные от базового класса события, либо перегрузить виртуальные обработчики тех же событий, подписанных в базовом классе. Какой путь выбирать, решать вам, но перегрузка кажется предпочтительней. Зачем создавать новую подписку, если есть уже старая.

Перегрузка наследуемых обработчиков библиотечного класса

При создании графического окна мы использовали свой класс, наследующий от библиотечного класса Form. Последний, в свою очередь, наследует от класса Control. Вот как представлена эта цепочка наследования в панели Object Browser оболочки


Среди множества событий, определенных в классе Control, есть и используемые нами. Все события класса Control подписаны в нем и для каждого определен защищенный виртуальный обработчик, который имеет имя события с префиксом On. Например, для события Click определен обработчик OnClick, для события Paint - OnPaint, и т.д.

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

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

using System;
using System.Windows.Forms;
using System.Drawing;
    
namespace MyApp
{
    // Наследует библиотечному классу
    class MyForm : Form
    {
        // Конструктор с настройками
        public MyForm()
        {
            // Начальная настройка окна
            this.Text = "Перегрузка обработчиков";
            this.BackColor = SystemColors.Window;
            this.StartPosition = FormStartPosition.CenterScreen;
        }
    
        // Обработчик события создан,
        // но класс на него не подписался
        protected override void OnClick(EventArgs e) 
        {
            MessageBox.Show("Выполнен одиночный щелчок!", 
                            "Класс MyForm");
        }
    
        protected override void OnResize(EventArgs e)
        {
            MessageBox.Show("Размеры окна изменены!", 
                            "Класс MyForm");
        }
    }
}
Листинг 6.13 . Код файла MyForm.cs
using System.Windows.Forms;
// Лишние пространства имен удалили
    
namespace MyApp
{
    class EntryPoint
    {
        public static void Main()
        {
            Application.Run(new MyForm());
        }
    }
}
Листинг 6.14 . Код файла Program.cs

Код получился намного короче и яснее.

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

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

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

 

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