неділя, 23 березня 2014 р.

Обробка подій в графічному вікні

В мові програмування Pascal ABC для обробки подій в графічному вікні використовується спеціальний модуль Events.
Модуль Events призначений для створення програм, в яких використовують методи керування подіями. Даний модуль використовується в парі з модулем GraphABC. В ньому містяться команди для обробки подій, які відбуваються на пристроях введення (клавіатура та миша).
В випадку підключення модулів GraphABC і Events програма після запуску та виконання тіла програми не завершується, а продовжує виконуватися, відстежуючи події, що виникають в графічному вікні при використанні пристроїв введення. Тобто програма відстежує події, які стосуються пристроїв введення, а також дій, пов'язаних з графічним вікном (зміна розмірів та закриття вікна). Робота програми завершується тільки після події, яка закриває графічне вікно.

Кожній події відповідає відповідна процедурна змінна:
Змінна
Подія
OnMouseDown
Натискання клавіші миші
OnMouseUp
Відпускання клавіші миші
OnMouseMove
Переміщення миші
OnKeyDown
Натискання будь-якої клавіші керування на клавіатурі
OnKeyUp
Відпускання клавіші клавіатури
OnKeyPress
Натискання символьної клавіші клавіатури
OnResize
Зміна розмірів графічного вікна
OnClose
Закриття графічного вікна
 До початку роботи програми значення процедурних змінних дорівнюють нулю. Для того щоб при настанні певної події була виконана певна дія, потрібно в програмі процедурній змінній присвоїти конкретну процедуру, яка буде виступати в ролі оброблювача подій. При виникненні однієї з вище перерахованих подій перевіряється чи містить відповідна процедурна змінна посилання на процедуру-оброблювач, якщо вона існує, то відповідна процедура-оброблювач виконується.
Процедурні змінні, які відповідають певним подіям, в модулі Events описані наступним чином:
Var
  • OnMouseDown, OnMouseUp, OnMouseMove: procedure (x,y,mousebutton: integer); – параметри х, у в оброблювачах OnMouseDown, OnMouseUp, OnMouseMove визначають координату курсору миші в момент настання події, параметр mousebutton може приймати наступні значення: 0 – жодна клавіша миші не натиснута, 1 – натиснута ліва клавіша миші, 2 – натиснута права клавіша миші;
  • OnKeyDown, OnKeyUp: procedure (key: integer); – параметр key в оброблювачах OnKeyDown, OnKeyUp визначає певний віртуальний код натиснутої клавіші;
  • OnKeyPress: procedure (ch: char); – параметр ch в оброблювачі OnKeyPress визначає натиснутий символ, якщо змінна-подія OnKeyPress має оброблювач, то графічне вікно не закривається при натисканні клавіші Esc;
  • OnResize, OnClose: procedure;.

Наприклад, якщо задана наступна процедура-оброблювач:
procedure MouseDown(x,y,mb: integer);
begin
  write(1);
end;
яка в основній програмі зв'язана з відповідною процедурною змінною:
  OnMouseDown:=MouseDown;
то всякий раз при натисканні клавіш миші в графічному вікні буде виводитись число 1.
Приклад такої програми:
Program p1;
uses GraphABC,Events,crt;
procedure MouseDown(x,y,mb: integer);
begin
  write(1);
end;
begin
  OnMouseDown:=MouseDown;
end.
Віртуальні коди клавіш
VK_Left
VK_Right
VK_Up
VK_Down
VK_Back
VK_Tab
VK_Return
VK_Escape
VK_Space
VK_Pause
VK_CapsLock
VK_NumLock
VK_ScrollLock
VK_Insert
VK_Delete
VK_Control
VK_Shift
VK_Alt
VK_F1
VK_F2
VK_F3
VK_F4
VK_F5
VK_F6
VK_F7
VK_F8
VK_F9
VK_F10
VK_F11
VK_F12
VK_PageUp VK_PageDown
VK_Home
VK_End

Алфавітно-цифрові клавіші мають віртуальний код, який дорівнює коду відповідного символу.
Приклад програми для обробки подій.
Програма малювання мишкою в графічному вікні.
uses GraphABC,Events;
procedure MouseDown(x,y,mb: integer);
begin
  MoveTo(x,y);
end;
procedure MouseMove(x,y,mb: integer);
begin
  if mb=1 then LineTo(x,y);
end;
begin
  OnMouseDown:=MouseDown;
  OnMouseMove:=MouseMove;
end.
Програма, яка дає можливість переміщувати графічне вікно клавішами курсора.
uses GraphABC,Events;
procedure KeyDown(Key: integer);
begin
  case Key of
VK_Left: SetWindowLeft(WindowLeft-2);
VK_Right: SetWindowLeft(WindowLeft+2);
VK_Up: SetWindowTop(WindowTop-2);
VK_Down: SetWindowTop(WindowTop+2);
  end;
end;
begin
  OnKeyDown:=KeyDown;
end.
Програма в якій при на тискання лівої клавіші миші коло починає рухатись від центру графічного вікна вверх, а потім вліво і вниз, при натисканні правої клавіші миші коло починає рухатись вправо, а потім вверх і вліво.
uses GraphAbc,Events;
var x,y,i:integer;
procedure a;
begin
for i:=0 to 230 do
begin
setbrushcolor(clAqua);
setpencolor(clred);
circle(x,y-i,10);
sleep(10);
setbrushcolor(clwhite);
setpencolor(clwhite);
circle(x,y-i,10);
end;
for i:=0 to 310 do
begin
setbrushcolor(clAqua);
setpencolor(clred);
circle(320-i,0+i,10);
sleep(10);
setbrushcolor(clwhite);
setpencolor(clwhite);
circle(320-i,0+i,10);
end;
end;
procedure b;
begin
for i:=0 to 310 do
begin
setbrushcolor(clAqua);
setpencolor(clred);
circle(x+i,y,10);
sleep(10);
setbrushcolor(clwhite);
setpencolor(clwhite);
circle(x+i,y,10);
end;
for i:=0 to 230 do
begin
setbrushcolor(clAqua);
setpencolor(clred);
circle(640-i,240-i,10);
sleep(10);
setbrushcolor(clwhite);
setpencolor(clwhite);
circle(640-i,240-i,10);
end;
end;
procedure mousedown(x,y,mb:integer);
begin
If mb=1 then a;
If mb=2 then b;
end;
begin
setwindowsize(640,480);
setpenwidth(2);
x:=320;
y:=240;
Onmousedown:=MouseDown;
end.

Немає коментарів:

Дописати коментар