АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

События мыши

Читайте также:
  1. Акции и специальные события
  2. Алармы и события
  3. Блока СКЗИ тахографа) информации о событиях
  4. Большинство битв в вашей жизни проиграны из-за невнимания к вещам и событиям.
  5. Вероятности события в независимых испытаниях.
  6. Вероятность появления хотя бы одного события.
  7. Вероятность случайного события – это количественная оценка объективной возможности появления данного события.
  8. Временные периоды или исторические события
  9. Глава 11. СОБЫТИЯ У СТЕНЫ ПРОДОЛЖАЮТ РАЗВОРАЧИВАТЬСЯ. Я ПО-ПРЕЖНЕМУ ОБРАЩАЮ СВОЙ ВЗОР НА СЕВЕР И ОСТАНАВЛИВАЮСЬ ЛИШЬ ДЛЯ ТОГО, ЧТОБЫ ОБРАТИТЬ ЖЕНЩИНУ В РАБСТВО
  10. Глава двенадцатая. ПРАЗДНИКИ. ЦАРСКИЕ ДНИ. СЕМЕЙНЫЕ СОБЫТИЯ
  11. Главные события
  12. ДАЛЬНЕЙШИЕ СОБЫТИЯ ИЗЛОЖЕНЫ ДОКТОРОМ. КАК БЫЛ ПОКИНУТ КОРАБЛЬ

Обработка событий

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

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

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

События делятся на три основные категории: события мыши, события клавиатуры и системные события.

События мыши

Для формы событие OnClick возникает в том случае, если пользователь нажимает левую кнопку мыши в то время, когда курсор мыши находится на поле формы.

Упражнение 2.3.4.1.1. Напишите приложение, которое при на­жатии левой кнопки мыши перекрашивает форму в красный цвет.

Решение

Создайте обработчик события OnClick: выберите страницу Events инспектора объектов и выполните двойной щелчок мы­шью в правой колонке, напротив события OnClick. На переднем плане появится окно редактирования модуля с помещенной сразу в нужное место модуля заготовкой обработчика события OnClick (рис. 2.3.4.1.1).

В обработчике события указан параметр Sender, в котором хранится имя объекта, породившего данное событие (в примере Sender будет содержать ссылку на объект MainF — форму).

Для изменения цвета формы в обработчике события OnClick напишем следующий оператор:

procedure TMainF.FormClick(Sender: TObject); begin

MainF.Color:= clRed (*)

end;

Поясним оператор (*). MainF — это название объекта фор­мы. Color — это свойство формы. Обращение к свойствам объ­екта происходит так же, как и в структуре данных записи, че­рез точку.

Эксперимент. Запустите приложение. Щелкните левой кноп­кой мыши на форме. Убедитесь, что цвет формы стал красным.

Что произойдет при повторном щелчке левой кнопкой мыши на форме? Возникнет событие OnClick, в результате которого вы­полнится оператор (*), т. е. цвет формы остается красным. ♦

Упражнение 2.3.4.1.2. Напишите приложение, в котором при каждом щелчке левой кнопкой мыши произвольным образом изменяется цвет формы.

Решение

Модифицируем код модуля Main.pas.

Для получения различных цветов для формы воспользуемся функцией RGB. Функция RGB(Red, Green, Blue) принимает три параметра - уровни интенсивности красного, зеленого и си­него цветов соответственно и возвращает цвет Win32 как целое значение. Для каждого уровня интенсивности существует 256 возможных значений. Например, RGB(255, 0, 0) возвращает цветовое значение для красного цвета, a RGB(255, 0, 255) — сиреневого цвета.

Итак, щелчок левой кнопкой мыши по форме порождает собы­тие OnClick формы, т. е. приводит к обращению к процедуре TMainF.FormClick, в результате чего выполняется оператор (*) — изменение цвета формы на красный. Изменим оператор (*) в со­ответствии с формулировкой задачи:

procedure TMainF.FormClick(Sender: TObject); begin

Color:= RGB(Random(256), Random(256), Random(256)); (**)
end;

Сравните правые части операторов (*) и (**). Оператор (*) изменяет цвет конкретного объекта типа TMainF (под именем MainF). Оператор (**) позволяет изменить цвет любого объекта типа TMainF, следовательно, этот оператор более общий, и да­лее будем использовать его при обращении к форме.

Эксперимент. Запустите приложение. Убедитесь, что после каждого щелчка по форме левой кнопкой цвет изменяется про­извольным образом. ♦

Упражнение 2.3.4.1.3. Напишите приложение, в котором при нажатии на левую кнопку мыши происходит смена цвета с зеленого на красный, и, наоборот, с красного — на зеленый.

Решение

При щелчке по левой кнопке мыши происходит событие On­Click. В соответствии с условием задачи в обработчике события OnClick формы необходимо проанализировать свойство Color формы: если его значение соответствует красному, то изменить его на зеленый (clGreen), иначе присвоить значение красный. На языке Object Pascal это записывается так:

procedure TMainF.FormClick(Sender: TObject); begin

if Color=clRed then Color:=clGreen else Color:=clRed; end;

Эксперимент. Сохраните приложение, запустите его. Про­верьте выполнение условия задачи. ♦

Событие OnDblClick происходит, если пользователь выпол­няет двойной щелчок левой кнопки мыши.

Упражнение 2.3.4.1.4. Напишите приложение, в котором при двойном щелчке левой кнопкой мыши изменяется вид курсора.

Решение

Каждое значение свойства Cursor имеет свой числовой экви­валент в пределах от -21 (crHandPoint) до 0 (crDefault). При каждом двойном щелчке левой кнопкой мыши значение свой­ства Cursor будем увеличивать на единицу, при достижении значения 0 — восстановим значение -21. Введите в обработчик события формы OnDblClick следующий оператор:

procedure TMainF.FormDblClick(Sender: TObject); begin

if Cursor=0 then Cursor:=-21 else Cursor:=Cursor+l; end;

Эксперимент. Сохраните проект и запустите его. Объясни­те, почему при каждом двойном щелчке левой кнопкой мыши сначала изменяется цвет формы, а затем — вид курсора. ♦

Событие OnMouseDown возникает, если пользователь нажи­мает на правую, левую или среднюю кнопку мыши. Заголовок обработчика этого события имеет вид:

procedure TMainF.FormMouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

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

procedure TMainF.FormMouseUp(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Событие OnMouseMove происходит, если пользователь пере­мещает указатель мыши. Заголовок обработчика этого события имеет вид:

procedure TMainF.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

В параметре Button обработчики этих событий получают одно из значений mbLeft, mbRight или mbMiddle, в зависимо­сти от того, какая кнопка мыши была нажата — левая, правая или средняя.

Параметр Shift указывает состояние клавиш Alt, Ctrl, Shift и кнопок мыши. Тип TShiftState описан так:

TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);

Значения ssShift, ssAlt, ssCtrl принадлежат множеству Shift, если клавиши Shift, Alt, Ctrl, соответственно, были нажаты; ssLeft, ssMiddle, ssRight — если нажаты левая, средняя или правая кнопки мыши; ssDouble — если произошел двойной щелчок.

В параметрах X и Y процедура получает координаты указа­теля мыши, выраженные в пикселях относительно формы.

Упражнение 2.3.4.1.5. Напишите приложение, позволяющее рисовать отрезки на форме.

Решение

Закройте предыдущий проект, выполнив команду Close All меню File. Создайте новое приложение, выполнив последовате­льность команд: File/ New Application. Сохраните новое приложение в папке Exercise2. Файл модуля — под именем Main.pas, файл проекта — Exercise2.dpr.

Измените свойства формы следующим образом:

 

 

Все графические операции в Delphi выполняются с использо­ванием свойства Canvas. Это свойство объектного типа. Класс TCanvas — сердцевина графической подсистемы Delphi. Он объ­единяет в себе контекст конкретного устройства GDI (интерфейс графических устройств) и «рабочие инструменты» (перо, кисть, шрифт, набор функций по рисованию типовых геометрических фигур). В процессе конструирования приложения свойство Can­vas недоступно в окне инспектора объектов, оно доступно только во время выполнения приложения. Некоторые свойства и мето­ды класса TCanvas представлены в приложении 1.

Чтобы нарисовать на форме пунктирную линию красного цвета от точки с координатами (10,10) до точки (300,300), со­здайте обработчик события формы Click и введите следующие операторы:

with Canvas do begin

Pen.Color:=ClRed; Pen.Style:=PsDash; MoveTo(10,10); LineTo(300,300); end;

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

Метод MoveTo(x,y) перемещает графический курсор в точку с координатами (х,у).

Метод LineTo(x.y) рисует отрезок от текущего положения графического курсора до точки с координатами (х,у).

Эксперимент. Сохраните проект. Убедитесь, что после щел­чка мышью по форме на канве отображается один отрезок, сое­диняющий пиксели с координатами (10, 10) и (300, 300). ♦

Модифицируем программу таким образом, чтобы можно было рисовать произвольные отрезки. Отрезок — это часть прямой, заключенная между двумя точками. Пусть нажатие кнопки мыши послужит началом рисования отрезка (переместим гра­фический курсор в точку, на которую указывает курсор мыши), освобождение кнопки мыши — завершением рисования отрез­ка (нарисуем линию до точки, на которую указывает курсор). Создайте обработчик события OnMouseDown:

procedure TMainF.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Canvas.MoveTo(X, Y); end;

Создайте обработчик события OnMouseUp:

procedure TMainF.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Canvas.LineTo(X, Y);

end;

Эксперимент. Сохраните приложение. Попробуйте с помо­щью приложения написать свое имя. ♦

Упражнение 2.3.4.1.6. Создайте приложение, позволяющее изображать кривые линии.

Решение

Закройте предыдущий проект, выполнив команду Close All меню File. Создайте новое приложение, выполнив последовате­льность команд: File/ New Application. Сохраните новое прило­жение в папке Exercise3. Файл модуля — под именем Main.pas, файл проекта — Exercise3.dpr.

Измените значения свойств формы следующим образом:

Кривая линия — это изображение следа курсора мыши. Пе­ремещение курсора мыши возбуждает событие OnMouseMove. Создайте обработчик этого события и введите следующий опе­ратор:

procedure TForml.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Canvas.LineTo(x,y);

end;

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

Устраним этот недостаток. Обработчик события OnMouseMove в параметре Shift получает состояние клавиш Ctrl, Alt, Shift и кнопок мыши. Для определенности положим, что линию будем рисовать в том случае, когда нажата левая кнопка мыши. Из­мените обработчик события следующим образом:

procedure TForml.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin if ssLeft in Shift then Canvas.LineTo(x, y)

{если нажата левая кнопка мыши, то рисуем линию} else Canvas.MoveTo(x, у);

{иначе перемещаем графический курсор без следа} end;

Эксперимент. Сохраните проект и запустите его. Проверь­те, что линия рисуется только тогда, когда перемещение мыши происходит с нажатой левой кнопкой. ♦

Упражнение 2.3.4.1.7. Напишите приложение, которое изоб­ражает прямоугольники (эллипсы).

Решение

Закройте предыдущий проект, выполнив команду Close All меню File. Создайте новое приложение, выполнив последовате­льность команд: File/ New Application. Сохраните новое прило­жение в папке Exercise4. Файл модуля — под именем Main, файл проекта — Exercise4.

Измените свойства формы следующим образом:

В классе TCanvas определен метод Rectangle(xl,yl,x2,y2), в котором параметры задают координаты противоположных вер­шин прямоугольника (т. е. принадлежащих одной из его диагона­лей). Нажатие кнопки мыши (событие OnMouseDown) фиксирует начало рисования прямоугольника и соответственно определяет координаты первой точки, а освобождение кнопки (событие Оп-MouseUp) — окончание рисования прямоугольника и соответ­ственно определяет координаты второй точки. Создайте обра­ботчики этих событий и введите следующие операторы:

procedure TMainF.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin

xl:=x;

yl:=y; end;

procedure TMainF.FormMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Canvas.Rectangle(xl,yl,x,y); {Canvas.Ellipse(xl,yl,x,у)}

end;

Переменные xl и yl являются глобальными, но их исполь­зование ограничивается пределами данного модуля, поэтому опишите их в разделе private класса TMainF.

Эксперимент. Удостоверьтесь в правильности работы про­граммы. ♦

Упражнение 2.3.4.1.8. Напишите приложение, которое позволяет рисовать ломаные линии.

Решение

Создайте новое приложение и сохраните его в папке Exerci-se5. Файл модуля — под именем Main.pas, файл проекта —

ExerciseS. dpr.

Измените свойства формы следующим образом:

Объединение отрезков AjAg, A2A3,..., образуют лома­ную А1А2А3... . Начало ломаной — это точка конец — точка . Для рисования ломаной нужно задать ее начало, затем нари­совать звенья (отрезки, причем конец одного является началом другого) и, наконец, завершить ломаную (отметить ее конец).

Начало (конец) рисования ломаной линии свяжем с событи­ем OnDblClick. Введем логическую переменную Draw: ее значе­ние, равное True, будет обозначать рисование ломаной, False — завершение ломаной. В разделе interface модуля введите раздел констант (после раздела описания переменных — Var):

const Draw: Boolean = False;

Создайте обработчик события OnDblClick: procedure TForml.FormDblClick (Sender: TObject);

begin

Draw:=not Draw; end;

В обработчике события OnMouseDown будем рисовать звенья ломаной, если значение переменной Draw равно True и переме­щать графический курсор, в противном случае:

procedure TForml.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

if Draw then Canvas.LineTo (x,y)

else Canvas.MoveTo(x,y); end;

Эксперимент. Сохраните проект, используя написанное при­ложение, попробуйте изобразить треугольник, четырехуголь­ник и пятиугольник. ♦

 

Задание для самостоятельного выполнения

1. Используя код упражнения 2.3.4.1.5, напишите приложе­ния для рисования разноцветных отрезков.

2. Напишите приложения для рисования эллипсов с закрашен­ной внутренней областью.

3. Модифицируйте код приложения из упражнения 2.3.4.1.5 так, чтобы при рисовании отрезок прорисовывался.

4. Измените код модуля, написанного в упражнении 2.3.4.1.8 для рисования замкнутых ломаных.

 


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



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.014 сек.)