Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_progr_Win / Lab1.doc
Скачиваний:
16
Добавлен:
23.03.2015
Размер:
1.51 Mб
Скачать

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)

{

switch(iMsg)

{

case WM_PAINT: //Перемалювати вміст клієнтської області вікна

{. . .}

break;

case WM_DESTROY: // Користувач видалив вікно

{. . . }

break;

default:

return DefWindowProc(hWnd, msg, wParam, lParam);

}

return DefWindowProc (hwnd, iMsg, wParam, lParam) ;

}//кінець WndProc

Додайте вищенаведений код до свого файлу з початковим кодом.

Функція вікна одержує повідомлення з двох джерел: із циклу обробки повідомлень і від Windows:

  • З циклу обробки повідомлень надходять повідомлення введення,: переміщення і натискання клавіш миші, натискання і відпускання клавіш клавіатури і, якщо встановлений генератор подій таймера, повідомлення від таймера.

  • Windows посилає функції вікна повідомлення підтримки вікна прямо, минаючи чергу додатка і цикл обробки повідомлень. Ці повідомлення звичайно викликані подіями, що вимагають негайної реакції по зміні виду вікна.

Соседние файлы в папке Lab_progr_Win