Обробка повiдомлень

 

Про всі події ядро Windows інформує вікна шляхом посилання повідомлень їх віконним функціям. Наприклад, при створенні вікна надсилається повідомлення wm_Create, при його переміщенні - wm_Move, в результаті натиску клавіші на клавіатурі - повідомлення wm_Char. Ядро Windows надсилає повідомлення про кожну подію, що відбулася в системі: переміщення маніпулятора миша, натиск клавіші на клавіатурі і т.п. Спочатку ці повідомлення поміщуються в системну чергу, а з неї пересилаються в чергу прикладної програми, для якої вони призначені.

Після дій по створенню та відображенню головного вікна програми потрібно почати обробку повідомлень. В бібліотеці ObjectWindows цикл обробки повідомлень реалізований в методі MessageLoop об'єкта TApplication.

Наведемо приклад нескладної програми, котра передбачає обробку повідомлень від миші.

 

Program BUTTONS;

 

Uses Objects, OWindows, ODialogs, WinProcs, WinTypes;

 

Const lBut=100;

rBut=101;

 

Type TApp=Object(TApplication)

procedure InitMainWindow; virtual;

end;

PWnd=^TWnd;

TWnd=Object(TWindow)

constructor Init( AParent: PWindowsObject; ATitle:PChar);

procedure wmlBut;

virtual id_First+lBut;

procedure wmrBut;

virtual id_First+rBut;

end;

 

procedure TApp.InitMainWindow;

begin

MainWindow:=New(PWnd, Init(nil,'Object Windows program'))

end;

 

constructor TWnd.Init( AParent: PWindowsObject; ATitle:PChar);

var ABtn:PButton;

begin

TWindow.Init(AParent,ATitle);

ABtn:=New(PButton,Init(@Self,lBut,'Left',50,55,75,30,false));

ABtn:=New(PButton,Init(@Self,rBut,'Right',265,55,75,30,false));

end;

 

procedure TWnd.wmlBut;

begin

MessageBox( hWindow,'You passed left button !','Message !!!',mb_Ok)

end;

 

procedure TWnd.wmrBut;

begin

if (MessageBox( hWindow,'Right button is EXIT !',

'Warning !!!',mb_OkCancel)=idOk) then

PostQuitMessage(0)

end;

 

Var

App:TApp;

 

Begin

App.Init('Sample program');

App.Run;

App.Done

End.

Наведена програма створює вікно з двома кнопками і реагує на їх натиск ( обробляє повідомлення, що надсилають кнопки ).

Розглянемо, як працює дана програма. В основній програмі викликається метод App.Init. Цей метод перепризначений, тому що треба створити вікно нового типу TWnd, а не стандартного TWindow. Процедурі ініціалізації вікна передаються параметри: перший - покажчик на батьківське вікно ( передаємо nil, бо для головного вікна програми батьківського не існує ), другий - заголовок вікна.

У конструкторі TWnd.Init спочатку викликається конструктор батьківського типу, а потім створюються дві кнопки. Конструкторам кнопок передається покажчик на батьківський об'єкт ( звичайно зберігається в параметрі Self ), константа - ідентифікатор кнопки ( використовується для обробки повідомлень ), надпис на кнопці та координати.

Слід звернути окрему увагу на опис об'єкта TWnd. Процедури - обробники повідомлень мають індекс. Зміст індексу такий: під час роботи програми створюється таблиця, яка містить адреси всіх обробників повідомлень. Так, в нашій програмі кнопки визначаються числовими ідентифікаторами - константами rBut і lBut. Відповідно процедури, що обробляють повідомлення від цих кнопок, визначені так:

procedure wmlBut;

virtual id_First+lBut;

procedure wmrBut;

virtual id_First+rBut;

 

Адреса процедури wmlBut знаходиться в таблиці обробників за адресою id_First+lBut. При надходженні повідомлення від елемента керування Windows спочатку визначає індекс цього елемента, потім з допомогою індексу отримує з таблиці обробників адресу процедури і передає керування їй.

Пояснимо роботу програми. При ініціалізації головного вікна програми створюються кнопки:

ABtn:=New( PButton, Init( @Self, lBut, 'Left', 50, 55, 75, 30, false));

де @Self - покажчик на батьківський об'єкт;

lBut - ідентифікатор елемента;

'Left' - надпис;

50,55,75,30 - розмір та положення.

У програмі використовується функція MessageBox. Ця функція виводить на екран вікно повідомлення. Параметри функцій мають наступний зміст:

  • першим параметром передається покажчик на батьківське вікно;
  • другий параметр задає текст повідомлення, а третій - заголовок вікна повідомлення;
  • четвертий параметр визначає кнопки у вікні повідомлення ( константа з префіксом mb_ ).
Функція повертає число, яке вказує на натиснуту кнопку (константа з префіксом mb ). Більш детально функція та параметри описані в допомозі ( Help ).

Ще одна використана функція PostQuitMessage ставить в чергу повідомлення про закриття програми. OWL надає програмістам систему віртуальної обробки повідомлень. Головний цикл обробки повідомлень писати не потрібно.