з інформацією про повідомлення. Структура MSG містить інформацію про вікно, якому призначене повідомлення, чисельне значення самого повідомлення, час і координати (для повідомлень від миші) виникнення повідомлення, а також два додаткових параметри wParam і lParam, зміст і значення яких залежать від особливостей повідомлення.
Пошук
Створення найпростішого Windows-додатка
Предмет:
Тип роботи:
Лабораторна робота
К-сть сторінок:
25
Мова:
Українська
Кожне одержуване додатком повідомлення (за винятком WM_QUIT) спрямовано одному з вікон додатка. Оскільки додаток не повинний прямо викликати функцію обробки вікна, для передачі повідомлення потрібному вікну використовується функція:
LONG DispatchMessage (const MSG FAR* lpmsg) ;
Ця функція передає msg назад у Windows. Windows відправляє повідомлення для його обробки відповідній віконній процедурі – у такий спосіб Windows викликає віконну процедуру.
Після того, як віконна функція обробить повідомлення, Windows повертає керування в додаток до наступного за викликом DispatchMessage коду, цикл обробки повідомлень у черговий раз відновляє роботу, викликаючи GetMessage. Якщо поле message повідомлення msg, витягнутого з черги повідомлень, дорівнює будь-якому значенню, крім WM_QUIT, то функція GetMessage повертає ненульове значення. Повідомлення WM_QUIT, витягнуте з черги додатка змушує перервати цикл обробки повідомлень.
Перед викликом функції DispatchMessage можуть бути поміщені спеціальні функції, що роблять над поміщеними в чергу повідомленнями якісь дії. Наприклад, перетворення деяких повідомлень, отриманих за допомогою клавіатури, у більш зрозумілі повідомлення можна за допомогою функції
BOOL TranslateMessage (const MSG FAR* lpmsg) ;
Додаток завершує свою роботу тоді, коли функція WinMain передає керування Windows. Передати керування можна в будь-якому місці WinMain, у тому числі і до входу в цикл обробки черги повідомлень.
Однак після входу в цикл обробки черги повідомлень єдиним способом завершити додаток є посилка в чергу додатка повідомлення WM_QUIT. Повідомлення WM_QUIT, таким чином, є засобом завершення роботи додатка. Воно звичайно заноситься в чергу повідомлень тільки функцією головного вікна даного додатка. Робиться це за допомогою виклику функції PostQuitMessage.
Коли функція GetMessage витягає повідомлення WM_QUIT з черги, вона повертає нуль, що призводить до завершення роботи додатка. При завершенні додатка варто акуратно звільняти зайняті ресурси – не варто покладатися в цьому на Windows.
Додайте фрагмент коду до функції WinMain, у якому здійснюється завершення роботи додатка:
...
while (GetMessage (&msg, NULL, 0, 0))
{TranslateMessage (&msg) ;
DispatchMessage (&msg) ; }
return msg. wParam; // завершення роботи додатка
} //кінець WinMain
2.7. Віконна процедура
Після того, як клас вікна зареєстрований, вікно створене і відображене і додаток увійшов у цикл обробки повідомлень, починається обробка повідомлень, що надходять, при цьому головна роль приділяється функції вікна.
Реальна робота додатка відбувається у віконних функціях. Саме віконна процедура визначає те, що виводиться в робочу область вікна і те, як вікно реагує на користувальницьке введення. Віконній процедурі можна призначати будь-яке ім'я, у програмі Windows може міститися більш однієї віконної процедури.
Віконна процедура завжди зв'язана з визначеним класом вікна, що реєструється за допомогою функції RegisterClass. Функція CreateWindow створює вікно на основі визначеного класу вікна. На основі того самого класу можна створити кілька вікон.
Віконна процедура завжди визначається в такий спосіб:
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ;
Ім'я віконної функції – це ім'я, зазначене в поле lpfnWndProc при заповненні класу вікна.
Усі чотири параметри віконної процедури ідентичні першим чотирьом полям структури MSG. Першим параметром є дескриптор вікна, що одержує повідомлення. Якщо в програмі створюється кілька вікон на основі того самого класу вікна (і отже однієї і тієї ж віконної процедури), тоді параметр hWnd ідентифікує конкретне вікно, що одержує повідомлення.
Функція вікна має одну дуже важливу властивість: вона викликається безпосередньо Windows і не може викликатися додатком прямо. Як і більшість функцій Windows, у функції вікна використовується угода про зв'язки мови Паскаль, тому оголошення функції CALLBACK обов'язково.
Функція вікна виглядає в такий спосіб (тут функція вікна обробляє повідомлення за допомогою спеціальної функції Windows, що робить стандартну обробку всіх повідомлень.) :
…
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow) {
…
} //кінець WinMain
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}
Функція DefWindowProc відіграє ключову роль у формуванні інформаційних потоків повідомлень Windows, і її вказівка у функції вікна обов'язкова. Перед тим, як передати керування функції DefWindowProc, можна перехопити й обробити практично будь-яке повідомлення.
2.8. Обробка повідомлень
Кожне одержуване вікном повідомлення ідентифікується номером, що міститься в параметрі msg віконної процедури. Якщо віконна процедура обробляє повідомлення, то її значенням, що повертається, повинний бути 0.
Усі повідомлення, не оброблювані віконною процедурою, повинні передаватися функції Windows DefWindowProc (такий механізм дозволяє Windows обробляти вікно разом із додатком). При цьому значення, що повертається функцією DefWindowProc, повинне бути значенням віконної процедури, що повертається.
Типовий вид функції вікна приводиться нижче:
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{