Про всі події ядро 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 надає програмістам систему
віртуальної обробки повідомлень. Головний цикл обробки повідомлень писати
не потрібно.