Пример использования стандартных событий классов

Понятие события

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

Каждый элемент управления (кнопка или строка меню) имеет свой идентификатор. Когда Вы нажимаете на кнопку или выбираете строку меню, в очередь сообщений приложения Windowsзаносит сообщение, содержащее идентификатор использованного элемента управления. Таким образом операционная система Windows направляет сообщение от использованного элемента управления в очередь того приложения, к которому принадлежит данный элемент управления.

Если в окне формы была нажата кнопка, то факт нажатия кнопки (сообщение) через операционную систему Windows вернется в очередь сообщений окна нашей формы и у кнопки возникнет событие Click.

Итак, механизм появления события понятен, но что это событие?

Из лекции 7 (состав класса) мы определили события класса как специальные методы, позволяющие классу реагировать на действия пользователя или на определенные изменения в программе.

Из этого определения событие и метод – обработчик события являются синонимами.

Уточним эти понятия. Каждый объект является экземпляром некоторого класса. Свойства класса определяют его состояние, а методы класса определяют его поведение.

У всех объектов один и тот же набор свойств, но значения свойств объектов различны, так что объекты одного класса могут находиться в разных состояниях. Например, значение свойства «доход», у объектов класса «Служащий», может очень сильно различаться, и эти объекты могут находиться в разных состояниях. Например, «Хочу купить автомобиль, но не имею возможности …».

Все объекты обладают одними и теми же методами и набор событий у всех объектов одного класса один и тот же, но вот методы, обрабатывающие возникшие события, могут быть разные. Например, у двух кнопок окна формы («Ввод данных», «Переход на форму 2») одинаковые события Click, но обработчики событий (их коды) разные.

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

События позволяют задать индивидуальное поведение объекта в специфических ситуациях, когда возникает некоторое сообщение.

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

Для многих действий пользователя (они предсказуемы) разработаны заготовки для обработчиков событий – смотри Properties ->Events.

 

14.2 Некоторые часто используемые события среды Visual Studio.NET

 

Для каждого элемента управления Windows-приложений определен свой набор событий, на которые он может реагировать. Заготовка шаблона обработчика события формируется двойным щелчком на поле, расположенное справа от имени соответствующего события на странице Events окна Properties для выбранного элемента управления.

Наиболее часто используемыми событиями для элементов управления являются следующие:

Click, DoubleClick – одинарный или двойной щелчок мышки:

KeyDown, KeyUp – нажатие и отпускание любой клавиши и их сочетаний;

KeyPress – нажатие клавиши, имеющей ASCII-код

MouseDown, MouseUp – нажатие и отпускание кнопки мыши;

MouseMove – перемещение мыши;

Paint – возникает при необходимости прорисовки формы.

Например, если дважды «Кликнуть» на кнопку, расположенную в окне нашей формы, то будет сформирован обработчик этого события со следующим заголовком:

private void button1_Click(object sender, EventArgs e).

Если нам необходимо обрабатывать событие, связанное с двойным нажатием кнопки мышки в пределах формы, то в «событиях» формы необходимо дважды «Кликнуть» на поле, расположенное справа от события KeyDown при этом появится шаблон обработчика этого события со следующим заголовком: private void Form1_MouseDoubleClick(object sender, MouseEventArgs e).

В качестве примеров привожу шаблоны еще двух обработчиков событий:

private void textBox1_KeyDown(object sender, KeyEventArgs e)

private void Form1_MouseClick(object sender, MouseEventArgs e)

Попробуйте определить сами, когда они формируются?

Анализируя шаблоны обработчиков событий можно отметить общую закономерность – у всех шаблонов два формальных параметра, причем первый (object sender) у всех одинаковый.

Во многих учебниках по программированию на языке C# при пояснении механизма работы события используется модель «публикация – подписка», в которой один класс, являющийся отправителем сообщения (sender), публикует сообщение, а другие классы, являющиеся получателями сообщения (receivers), подписываются на получение этих сообщений.

В соответствии с этой терминологией первый формальный параметр всех обработчиков сообщений sender типа object (класс object является базовым любого класса языка C#) является отправителем сообщения (иногда говорят – источником сообщения).

Второй формальный параметр шаблонов обработчиков событий является переменная типа объект точнее ссылкой на объект класса ХХХEventArgs, который содержит связанные с событием параметры (фактически сообщение), например, для обработчиков мышки можно получить координаты e.X e.Y курсора мышки. Класс ХХХEventArgs (ХХХ имя события) во всех стандартных событиях является наследником системного класса EventArgs.

При описании модели «публикация – подписка» отмечалось, что получатели сообщений (receivers), подписываются на получение этих сообщений. То есть для элементов управления и формы необходимо указывать (подписывать) сообщения, на которые должен реагировать этот элемент. Поскольку все методы обработчиков событий имеют единый формат записи, то их можно объединять (подписывать) с помощью многоадресных делегатов – делегатов, способных указывать на любое количество функций. Для каждого элемента в файле Form1.Designer.cs, в разделе инициализации помимо определения свойств элементов управления, определяются перечень событий, на которые должен реагировать этот элемент управления. Например, фрагмент инициализации формы с определением перечня событий, на которые она должна реагировать, имеет следующий вид:

private void InitializeComponent()

{

. . .

this.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler

(this.Form1_MouseDoubleClick);

this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);

this.MouseClick += new System.Windows.Forms.MouseEventHandler

(this.Form1_MouseClick);

this.MouseMove += new System.Windows.Forms.MouseEventHandler

(this.Form1_MouseMove);

. . ..

}

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

 

Пример использования стандартных событий классов

 

Рассмотрим чисто учебную программу, использующие некоторые «стандартные» события классов.

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

private void Form1_MouseClick(object sender, MouseEventArgs e)

{

if ((e.X < 20 && e.X > 0 && e.Y < 20 & e.Y > 0) && p == 0)

Этот прием часто используется программистами для формирования реакции программы на «клик» мышки в определенных местах экрана, например, карты города или фото группы студентов – легко написать необходимые комментарии при «попадании» мышки в определенный участок формы.

Обработчик события перемещения мышки по форме (дополнительное условие p==1) позволяет записать положения курсора мышки в массив 100 точек.

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

С помощью обработчика – нажатия клавиши в окне редактора осуществляется начальная установка программы.

Исходный код программы:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public int p,i,j;

int[,] tk = new int[100, 2];

public Form1()

{

InitializeComponent();

textBox1.Text = "";

p = 0; i = 0; j = 0;

}

private void Form1_MouseClick(object sender, MouseEventArgs e)

{

if ((e.X < 20 && e.X > 0 && e.Y < 20 & e.Y > 0) && p == 0)

{

textBox1.AppendText("Вы кликнули мышкой в верхнем левом углу

\r\n");

p++;

}

}

private void Form1_MouseMove(object sender, MouseEventArgs e)

{

if (p == 1)

if (i < 100) { tk[i, 0] = e.X; tk[i, 1] = e.Y; i++; }

else

{

textBox1.AppendText("Заполнение массива закончено \r\n");

p++;

}

}

private void Form1_MouseDoubleClick(object sender,

MouseEventArgs e)

{

this.Invalidate();

}

private void Form1_Paint(object sender, PaintEventArgs e)

{

Pen myPen = new Pen(Color.Red, 2);

Graphics g = e.Graphics;

for (int n = 0; n < 100; n++)

g.DrawEllipse(myPen, tk[n, 0], tk[n, 1], 2, 2);

}

private void textBox1_KeyDown(object sender, KeyEventArgs e)

{

p = 0; i = 0;

}

}

}

Работа программы:

 

 

Рисунок 14.1 – Запуск программы и заполнение массива

 

 

Рисунок 14.2 – Просмотр массива, сброс программы и ее повторный запуск

 








Дата добавления: 2018-11-25; просмотров: 466;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.024 сек.