Подключение метода обработчика событий к событию
Вы удивляетесь, почему ничего не происходит при нажатии на кнопку? Дело в том, что указанный метод вызывается только тогда, когда мы свяжем с ним событие нажатия на кнопку, указав в программе: при нажатии на кнопку необходимо перейти к определенному обработчику событий.
Когда в программе используются разные кнопки и несколько обработчиков событий, без такого уточнения не обойтись, так как компьютер должен знать, какой именно метод следует выполнять при нажатии на определенную кнопку.
Код для связывания события объекта с методом обработчика события выглядит тоже несколько странно.
using System;
using System.Windows.Forms;
class MyButtonClass : Form
{
private Button mrButton;
// Метод-конструктор
public MyButtonClass()
{
mrButton = new Button();
mrButton.Text = "Нажми меня";
// Код для связывания события объекта с методом обработчика события
mrButton.Click += new System.EventHandler(MyButtonClickEventHandler);
this.Controls.Add(mrButton);
}
// Основной метод
static void Main()
{
Application.Run(new MyButtonClass());
}
// Метод-обработчик событий
void MyButtonClickEventHandler(object sender, EventArgs e)
{
mrButton.Text = "Вы нажали меня!";
}
}
С компьютерного языка это можно перевести следующим образом:
"Путем нажатия на кнопку mrButton надо связать событие Click с методом обработчика событий, который называется MyButtonClickEventHandler".
При нажатии на кнопку приведенная выше строка кода позволяет системе вызвать метод обработчика событий, после его выполнения надпись на кнопке меняется на "Вы нажали меня!".
Чтобы использовать этот код, остановите свою программу, добавьте в нее выделенный код и нажмите клавишу F5 для выполнения программы. Нажмите на кнопку, и надпись на ней изменится. Рабочую программу — пример события нажатия на кнопку — можно найти в папке примеров, прилагаемых к курсу (Проект Example5).
Примечание редактора. Программа работает, но можно немного улучшить ее внешний вид. Сейчас положение кнопки на форме и ее размеры установлены по умолчанию. Для изменения этих параметров добавьте в конструктор класса необходимые строчки, и снова запустите программу.
public MyButtonClass()
{
mrButton = new Button();
mrButton.Text = "Нажми меня";
mrButton.Top = 100;
mrButton.Left = 100;
mrButton.Height = 50;
mrButton.Width = 70;
mrButton.Click += new System.EventHandler(MyButtonClickEventHandler);
this.Controls.Add(mrButton);
}
Теперь мы попробуем описать основную структуру метода обработчика событий мыши. Вероятно, в этом случае вы захотите использовать информацию, подставляемую в параметр MouseEventArgs, хотя бы для того, чтобы выяснить, какая из кнопок мыши нажимается.
public void TheMouseIsDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
this.Text = "Нажата левая кнопка мыши";
}
Далее показано, как связать событие с методом. В переводе с компьютерного в тексте написано следующее: "Если при выполнении этой программы нажимается кнопка мыши, надо перейти к методу TheMouseIsDown", которому известно, как следует обрабатывать события мыши:
this.MouseDown += new MouseEventHandler(TheMouseIsDown);
Можно внести некоторые улучшения, чтобы при запуске следующего обработчика код, содержащийся в нем, делал окно более широким или узким в зависимости от нажимаемой кнопки.
public void TheMouseWasClicked(object sender, MouseEventArgs e)
{
// При нажатии левой кнопки
if (e.Button == MouseButtons.Left)
// Расширение текущего окна
this.Width = this.Width + 100;
else if (e.Button == MouseButtons.Right)
// Сужение текущего окна
this.Width = this.Width – 100;
}
Другой обработчик событий позволяет обнаружить перемещение мыши и рисовать окружность в том месте, где находится курсор:
public void TheMouseMoved(object sender, MouseEventArgs e)
{
// Подготовка области рисования
System.Drawing.Graphics g = this.CreateGraphics();
// Использование красной ручки
System.Drawing.Pen redPen = new System.Drawing.Pen(System.Drawing.Color.Red, 3);
// Рисуем окружность как эллипс с равными осями.
// Окружность рисуется в охватывающем ее квадрате.
// Координаты X и Y левого верхнего угла квадрата
// определяются координатами текущего положения мыши.
g.DrawEllipse(redPen, e.X, e.Y, 40, 40);
// Очистка
g.Dispose();
}
На снимке экрана показано, как это выглядит при перемещении мыши:
Ниже представлен текст программы