Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб.7. Разработка элементов основного меню.doc
Скачиваний:
1
Добавлен:
29.08.2019
Размер:
374.78 Кб
Скачать

Простой пример с кнопкой

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

// listing 2

// Добавление кнопки.

using System;

using System.Windows.Forms;

using System.Drawing;

class ButtonForm : Form

{

Button MyButton = new Button();

public ButtonForm()

{

Text = "Использование кнопки";

MyButton.Text = "Щелкните";

MyButton.Location = new Point(100, 200);

Controls.Add(MyButton);

}

[STAThread]

public static void Main()

{

ButtonForm skel = new ButtonForm();

Application.Run(skel);

}

}

В этой программе создается класс ButtonForm, который является производным от класса Form. Он содержит поле типа Button с именем MyButton. В конструкторе класса ButtonForm кнопка создается, инициализируется и помещается на форму. При выполнении этой программы отображается следующее окно:

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

Обработка сообщений в Windows-приложениях (на примере обработки сообщений от кнопки).

Чтобы программа реагировала на щелчок на кнопке (или на какое-либо другое действие пользователя), необходимо обеспечить обработку сообщения, которое генерирует эта кнопка.

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

В С#-программе, основанной на применении окон, такие сообщения обрабатываются обработчиками событий.

Следовательно, чтобы получить сообщение, программа должна добавить

собственный обработчик событий в список обработчиков, вызываемых при генерировании сообщения.

Для сообщений, связанных со щелчком на кнопке, это означает добавление обработчика для события Click.

Событие Click определяется в классе Button. (Событие Click унаследовано от класса Control.) Его общий формат таков:

public Event EventHandler Click;

Делегат EventHandler определяется так:

public delegate void EventHandler(object who, EventArgs args)

Объект, который сгенерировал событие, передается в параметре who, а информация, связанная с этим событием, — в параметре args.

Для многих событий в качестве параметра args будет служить объект класса, выведенного из класса EventArgs. Поскольку щелчок на кнопке не требует дополнительной информации, при обработке события щелчка на кнопке не нужно беспокоиться об аргументах этого события.

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

// listing 3

// Обработка сообщений от кнопки.

using System;

using System.Windows.Forms;

using System.Drawing;

class ButtonForm : Form

{

Button MyButton = new Button(); // создание экз. кнопки

public ButtonForm() // конструктор

{

Text = "Реакция на щелчок"; // надпись на форме

MyButton.Text = "Щелкните"; // надпись на кнопке

MyButton.Location = new Point(100, 200); // коорд. кнопки

// Добавляем в список обработчик событий кнопки.

MyButton.Click += new EventHandler(MyButtonClick);

Controls.Add(MyButton); // добавляем кн. на форму

}

[STAThread]

public static void Main()

{

ButtonForm skel = new ButtonForm();

Application.Run(skel);

}

// Обработчик для кнопки MyButton.

protected void MyButtonClick(object who, EventArgs e)

{

if(MyButton.Top == 200)

MyButton.Location = new Point(10, 10);

else

MyButton.Location = new Point(100, 200);

}

}

Рассмотрим код обработчика события щелчка на кнопке:

// Обработчик для кнопки MyButton.

protected void MyButtonClick(object who, EventArgs e)

{

if(MyButton.Top == 200)

MyButton.Location = new Point(10, 10);

else

MyButton.Location = new Point(100, 200);

}

Обработчик MyButtonClick () использует такую же сигнатуру, как и приведенный выше делегат EventHandler, а это значит, что обработчик можно добавить в цепочку обработчиков для события Click.

Обратите внимание на то, что в его определении использован модификатор типа protected. И хотя это не является обязательным требованием, такая модификация имеет смысл, поскольку обработчики событий не предназначены для вызова кодом, а используются лишь для ответа на события.

В коде обработчика координаты верхней границы кнопки определяются с помощью свойства Тор.

Следующие свойства определяются для всех элементов управления (они задают координаты верхнего левого и нижнего правого углов):

public int Top { get; set; }

public int Bottom { get; }

public int Left { get; set; }

public int Right { get; }

Обратите внимание на то, что местоположение элемента управления можно изменить с помощью свойств Тор и Left, но не свойств Bottom и Right, так как последние предназначены только для чтения. (Для изменения размера элемента управления можно использовать свойства Width и Height.)

При получении события, связанного со щелчком на кнопке, проверяется координата ее верхней границы, и, если она равна начальному значению 200, для кнопки устанавливаются новые координаты: 10, 10. В противном случае кнопка возвращается в исходное положение с координатами 100, 200. Поэтому при каждом щелчке на кнопке ее местоположение меняется.

Прежде чем обработчик MyButtonClick () сможет получать сообщения, его необходимо добавить в цепочку обработчиков событий, связанную с событием Click. Это реализуется в конструкторе класса ButtonForm с помощью такой инструкции:

MyButton.Click += new EventHandler(MyButtonClick);

После выполнения этой инструкции при каждом щелчке на кнопке и будет вызываться обработчик событий MyButtonClick ().

Альтернативная реализация.

Интересно отметить, что обработчик событий MyButtonClick () можно написать по-другому.

Вспомните, что параметр who обработчика событий принимает ссылку на объект, который сгенерировал вызов. Когда происходит событие, связанное со щелчком на кнопке, таким объектом является кнопка, на которой был сделан щелчок. Поэтому обработчик MyButtonClick () может иметь такой код:

// listing 4

// Альтернативный вариант обработчика событий.

protected void MyButtonClick(object who, EventArgs e)

{

Button b = (Button) who;

if(b.Top == 200)

b.Location = new Point(10, 10);

else

b.Location = new Point(100, 200);

}

В этой версии обработчика значение параметра who приводится к типу Button, и именно эта ссылка (а не поле MyButton) используется для доступа к объекту кнопки.

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