Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 927

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


}
// Процедура обработки события, когда указатель мыши покидает

// элемент управления ListBox

private void listBox1_MouseLeave(object sender, EventArgs e)

{

listBox1.Items.Add("Курсор мыши вышел из области ListBox");

}

// Процедура обработки события, происходящего при перемещении

// указателя мыши по элементу управления ListBox

private void listBox1_MouseMove(object sender, MouseEventArgs e)

{ // Свойство объекта Control MousePosition возвращает точку,

// соответствующую текущему положению мыши относительно

// левого верхнего угла монитора

textBox1.Text = string.Format("X = {0} или {1}", Form1.MousePosition.X, e.X);

textBox2.Text = string.Format("Y = {0} или {1}", Form1.MousePosition.Y, e.Y);

}

}

}

Как видно, при обработке события мыши MouseEnter, когда курсор мыши вхо­дит в границы элемента управления, в список ListBox1 добавляется (метод Add) запись "Курсор мыши вошел в область ListBox". При обработке события мыши MouseLeave, когда курсор мыши выходит за пределы элемента управления, в спи­сок ListBox добавляется запись "Курсор мыши вышел из области ListBox". Таким образом, отслеживая поведение мыши, мы заполняем список ListBox1.

При обработке события MouseMove, когда курсор мыши перемещается в преде­лах элемента управления ListBox1, в текстовые поля записываем координаты X и Yкурсора мыши, пользуясь свойством объекта Control MousePosition. Здесь мы получаем координаты положения курсора мыши в системе координат экрана, когда начало координат расположено в левом верхнем углу экрана, ось х направлена вправо, а ось у — вниз.

Заметим, что аргументы события мыши е также содержат в себе текущие коор­динаты курсора мыши, но в системе координат элемента управления, в данном слу­чае listBox1. Начало координат этой системы расположено в левом верхнем углу элемента управления listBox1, ось х также направлена вправо, ось у— вниз. Эти координаты получаем из аргументов события е.X и e.Y и выводим их в текстовое поле, отделяя от предыдущих координат словом "или".

Таким образом, добиваемся контроля положения курсора мыши, обрабатывая события мыши. Убедиться в работоспособности программы можно, открыв реше­ние Monitoring.sin папки Monitoring.

Пример 16. Создание элемента управления Button"программным" способом и подключение события для него

Мы знаем, как, используя панель элементов управления, в форму перенести мышью нужный элемент. Чтобы сделать разработку программы более управляемой, в данной программе научимся создавать элементы управления в форме "про­граммным" способом, т. е. с помощью написания непосредственно программного кода, не используя при этом панель элементов управления
Toolbox. Понятно, что название "программным" является более чем условным, поскольку в описываемой нами среде трудно назвать что-либо, что "программным" не является.

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

Для этого создаем новый проект с формой. При этом, как обычно, запускаем Visual Studio 2010, в окне New Project выбираем шаблон Windows Forms Applica­tion С#. Далее вводим программный код, представленный в листинге 3.2.

Листинг 3.2. Создание кнопки "программным" способом

// Программа создает командную кнопку в форме "программным" способом,

// т. е. с помощью написания непосредственно программного кода, не используя

// при этом панель элементов управления Toolbox. Программа задает свойства

// кнопки: ее видимость, размеры, положение, надпись на кнопке

//и подключает событие "щелчок на кнопке"

using System;

using System.Drawing;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace NewButton

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

// Создание кнопки без панели элементов управления:

Button button1 = new Button();

// Задаем свойства кнопки:

button1.Visible = true;

// Ширина и высота кнопки:

button1.Size = new Size(100, 30);

// Расположение кнопки в системе координат формы:

button1.Location = new Point(100, 80);

button1.Text = "Новая кнопка";

// Добавление кнопки в коллекцию элементов управления

this. Controls. Add (button1);

// Подписку на событие Click для кнопки можно делать "вручную".

// связываем событие Click с процедурой обработки этого сооытия:

button1.Click += new EventHandler(buttonl_Click);

}

// Создаем обработчик события Click для кнопки:

private void button1_Click(object sender, EventArgs e)

{

MessageBox.Show("Нажата новая кнопка");

}

}

}

Как видно, сразу после выполнения процедуры InitializeComponent создаем новый объект button1 стандартного класса кнопок. Задаем свойства кнопки: ее ви­димость (visible), размеры (size), положение (Location) относительно левого нижнего угла формы, надпись на кнопке — "Новая кнопка".

Далее необходимо организовать корректную работу с событием "щелчок на созданной нами командной кнопке". В предыдущих примерах мы для этой цели в конструкторе формы дважды щелкали на проектируемой кнопке, и исполняемая среда автоматически генерировала пустой обработчик этого события в программ­ном коде. Или опять же в конструкторе формы в панели свойств проектируемой кнопки щелкали мышью на значке молнии (

Events) и в появившемся списке всех событий выбирали необходимое событие. Однако согласно условию задачи мы должны организовать обработку события "программным" способом без использо­вания конструктора формы. Для этого в программном коде сразу после добавления командной кнопки в коллекцию элементов управления ставим оператор "точка" (.) после имени кнопки button1 и в выпадающем списке выбираем необходимое со­бытие click. Затем, как приведено в листинге 3.2, осуществляем так называемую "подписку" на данное событие, т. е. с помощью ключевого слова EventHandler свя­зываем событие click с процедурой обработки события button1_click. Такое на­звание процедуры обработки события принято в среде Visual Studio, но не является обязательным, мы могли бы назвать эту процедуру, например, русскими буквами: "КЛИК". Теперь создадим обработчик события button1_click, как показано в листинге 3.2. В этой процедуре предусматриваем вывод сообщения "Нажата новая кнопка". На рис. 3.2 приведен фрагмент работы программы.



Рис. 3.2. Создание кнопки программным способом

В заключение отметим, что в случае создания пустого обработчика события в конструкторе формы строка подписки на событие формируется автоматически в методе InitializeComponent в файле Form1.Designer.cs проекта. Убедиться в рабо­тоспособности программы можно, открыв решение NewButton.sln папки NewButton.
Пример 17. Обработка нескольких событий одной процедурой

Для того чтобы события от нескольких элементов управления обрабатывались одной процедурой обработки события, в некоторых языках, например в VB6, было предусмотрено создание массива элементов управления. Однако в современных языках Visual Studio элементы не могут быть сгруппированы в массивы. Но можно организовать обработку нескольких событий одной процедурой путем подписки этих событий на одну и ту же процедуру их обработки.

Как это сделать, покажем на примере, когда в форме присутствуют две команд­ные кнопки, и щелчок на любой из них обрабатывается одной процедурой. При этом, используя параметр процедуры sender, будем определять, на какой из двух кнопок щелкнули мышью.

Итак, запустим Visual Studio 2010, закажем новый проект шаблона
Windows Forms Application С#. Затем из панели элементов перенесем в форму две команд­ных кнопки и текстовую метку. Далее через щелчок правой кнопкой мыши перей­дем к вкладке программного кода (листинг 3.3).

Листинг 3.3. Связывание двух событий с одной процедурой обработки

//В форме имеем две командные кнопки, и при нажатии указателем мыши

// любой из них получаем номер нажатой кнопки. При этом в программе

// предусмотрена только одна процедура обработки событий using System;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются

//в данной программе

namespace ДваСобытияОднаПроц

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

base.Text = "Щелкните на кнопке";

// Подписку на событие можно делать "вручную", но при этом в

// Form1.Designer.cs следует удалить (или закомментировать)

// соответствующие EventHandler.

// Связываем события Click от обеих кнопок с одной процедурой КЛИК:

button1.Click += new EventHandler(this.КЛИК);

button2.Click += new EventHandler(this.КЛИК);

label1.Text = null;

// Подпиской на событие называют связывание названия события

//с названием процедуры обработки события посредством EventHandler

}

private void KЛИK(object sender, EventArgs e)

{

// String S = Convert.ToString(sender);

// получить текст, отображаемый на кнопке, можно таким образом:

Button Кнопка = (Button)sender;

// или string НадписьНаКнопке = ((Button)sender).Text;

label1.Text = "Нажата кнопка " + Кнопка.Text; // или Кнопка.Name

}

}

}

Как видно из текста программы, сразу после выполнения процедуры ItializeComponent осуществляем так называемую подписку на событие, т. е. вязываем название события с названием процедуры обработки события клик посредством делегата EventHandler. Заметим, что оба события click мы связали с одной и той же процедурой клик.

Далее создаем процедуру обработки события клик, ее параметр sender содер­жит ссылку на объект-источник события, т. е. кнопку, нажатую пользователем. С помощью неявного преобразования можно конвертировать параметр sender в экземпляр класса Button и, таким образом, выяснить все свойства кнопки, которая инициировала событие.

На рис. 3.3 приведен пример работы написанной программы. Мы убедились в этом разделе, что сведения об объекте, который создал собы­тие, находятся в объектной переменной sender. Работу этой программы можно ис­следовать, открыв соответствующее решение в папке ДваСобытияОднаПроц.




Рис. 3.3. Фрагмент работы программы, определяющей нажатую кнопку

Пример 18. Калькулятор

Обработка нескольких событий от разных объектов одной процедурой оказы­вается весьма полезной при программировании данного приложения. Напишем программу Калькулятор с кнопками-цифрами, выполняющую только арифметиче­ские операции, причем управление Калькулятором возможно только мышью.

Запустив Visual Studio 2010 и выбрав шаблон Windows Forms Application С# перетащим из панели Toolbox в форму 16 командных кнопок для ввода цифр, арифметических операций, знака "равно" (=) и операции Очистить, а также тек­стовое поле. Вкладка Form1.cs [Design] будет иметь примерно такой вид, как пока­зано на рис. 3.4.



Рис. 3.4. Вкладка конструктора формы

В листинге 3.4 приведен программный код данного приложения.

Листинг 3.4. Калькулятор

// Программа Калькулятор с кнопками цифр. Управление калькулятором возможно

// только мышью. Данный калькулятор выполняет лишь арифметические операции

using System;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace Calc

{

public partial class Form1 : Form

{

string Znak = null; // знак арифметической операции

bool Начало_Ввода = true; // ожидание ввода нового числа

Double Число1, Число2; // Первое и второе числа, вводимые пользователем

public Form1()

{

InitializeComponent();

this.Text = "Калькулятор";

button1.Text = "1"; button2.Text = "2"; button3.Text = "3"; button4.Text = " 4"; button5.Text = "5"; button6.Text = "6"; button7.Text = "7"; button8.Text = "8"; button9.Text = "9"; button10.Text = "0"; button11.Text = " = "; button12.Text = "+"; button13.Text = "-"; button14.Text = "*"; button15.Text = "/"; button16.Text = "Очистить";

textBox1.Text = "0";

textBox1.TextAlign = HorizontalAlignment.Right;

// Связываем все события "щелчок на кнопках-цифрах"

//с обработчиком ЦИФРА:

this.button1.Click += new System.EventHandler(this.ЦИФРА);

this.button2.Click += new System.EventHandler(this.ЦИФРА);

this.button3.Click += new System.EventHandler(this.ЦИФРА);

this.button4.Click += new System.EventHandler(this.ЦИФРА);

this.button5.Click += new System.EventHandler(this.ЦИФРА);

this.button6.Click += new System.EventHandler(this.ЦИФРА);

this.button7.Click += new System.EventHandler(this.ЦИФРА);

this.button8.Click += new System.EventHandler(this.ЦИФРА);

this.button9.Click += new System.EventHandler(this.ЦИФРА);

this.button10.Click += new System.EventHandler(this.ЦИФРА);

this.button12.Click += new System.EventHandler(this.ОПЕРАЦИЯ);

this.button13.Click += new System.EventHandler(this.ОПЕРАЦИЯ);