Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ІК (Говорущенко) Методичка.doc
Скачиваний:
6
Добавлен:
23.02.2016
Размер:
762.88 Кб
Скачать

І. Теоретичні відомості

Визначення вікна

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

З точки зору мови програмування, вікна – це об’єкти (змінні), над якими виконують дії. Об’єкт належить до певного класу (типу), який описує множину параметрів стану вікна (даних) і функцію (метод) їх обробки.

Головне вікно має подвійні рамки, заголовок, кнопки, смугу меню, панель інструментів з кнопками, смуги перегляду, рядок стану та ін. Ці елементи також є вікнами, мають свої дані та метод їх зміни – належать до класу вікон.

Програми для Windows називають додатками. Користувач з додатком взаємодіє за допомогою наступних вікон:

  1. вікно додатку організовує роботу, з’являється першим при запуску та закривається разом з припиненням роботи додатку;

  2. MDI-вікна служать для обробки декількох документів;

  3. вікно допомоги більшою мірою працює під управлінням операційної системи, ніж під управлінням додатку;

  4. діалогове вікно забезпечує оперативний обмін даними між користувачем і додатком.

Клас вікон

При створенні вікон операційній системі вказують, до якого класу воно належить. Якщо операційній системі відомий клас створюваного вікна (наприклад, це передвизначений системою або зареєстрований якимось додатком клас), то використовують ім’я цього класу. Інакше описують функцію вікна і набір застосовуваних ресурсів і реєструють новий клас.

Набір використовуваних ресурсів класа віконзадають в структурі типуWNDCLASS, яка описується наступним чином:

typedef struct

{ UINT style; //стиль вікон цього класу

WNDPROC lpfn WndProc; //ім.’я функції вікна

Int cbClsExtra; //додаткова пам’ять для класу

HANDLE hInstance; //додаткова пам’ять для кожного вікна

HICON hIcon; //дескриптор додатку

HCURSOR hCursor; //дескриптор іконки для кожного вікна

HBRUSH hbrBackground; //дескриптор курсору миші

LPCTSTR lpszMenuName; //дескриптор пензля для фону вікна

LPCTSTR lpszClassName; //ім’я ресурсу меню

} WNDCLASS; //ім’я створюваного класу

Наприклад, якщо описана структура цього ж типу WNDCLASS wc; то присвоюють певні значення її полям.

Таблиця 1.1. Список стилів класу вікон

Значення

Пояснення

CS_BYTEALIGNCLIENT

Робочу область вікна вирівнювати по границі байта відеопам’яті. Це пришвидшує перемалювання вікна, впливає на розміри вікна по осі Х

CS_BYTEALIGNWINDOW

Все вікно вирівнювати по границі байта відеопам’яті. Цей стиль впливає на розміри вікна по осі Х

CS_CLASSDC

Створити єдиний контекст відображення для всіх вікон

CS_DBLCLKS

Функція вікна буде одержувати повідомлення при подвійному клацанні клавішею миші над робочою областю

CS_DROP

SHADOW

Вікна з ефектом затінення. Застосовують до вікон малих розмірів, які з’являються на короткий час

CS_GLOBALCLASS

Доступний всім додаткам клас

CS_HRE

DRAW

Робочу область перемальовувати при зміні ширини вікна

CS_NOCLOSE

Вимкнути команду Closeна системному меню

CS_OWNDC

Створити свій контекст пристрою для кожного вікна

CS_PARENT

DC

Вікна будуть користуватись контекстом пристроя батьківського вікна

CS_SAVEBITS

Частина вікна, затіненого іншим вікном, зберігати у вигляді бітового образа і використовувати цей образ для відтворення цієї частини при переміщенні вікна, що затіняє

CS_VRE

DRAW

Робочу область перемальовувати при зміні висоти вікна

Для реєстрації класу вікон зручно використовувати функцію наступного вигляду:

int RegClass (WNDPROC Proc, LPCTSTR szName)

{ WNDCLASS wc;

wc.style=CS_HREDRAW|CS_VREDRAW;

wc.cbClsExtra=wc.cbWndExtra=0;

wc.lpfnWndProc=Proc;

wc.hInstance=hInstance;

wc.hIcon=LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor=LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);

wc.lpszMenuName=(LPCTSTR) NULL;

wc.lpszClassName=szName;

return RegisterClass(&wc);}

Формальними параметрами цієї функції є покажчики на функцію вікна і рядок з ім’ям класу. Ім’я, список формальних параметрів і тип повернення функції можуть бути будь-якими. Головне, щоб додатку після реєстрації було доступне ім’я зареєстрованого класу, а операційній системі – функція вікна цього класу.

Функція вікнаописує реакцію вікна на повідомлення, що надходять. Вона від звичайних функцій відрізняється наступним:

  • має стандартні тип повернення і список формальних параметрів;

  • викликається лише операційною системою при надходженні повідомлень вікну;

  • повідомлення, які не обробляються функцією вікна, повертаються операційній системі.

В об’єктно-орієнтованому програмуванні методи зміни параметрів об’єкта (функціїї-члени) описують окремо. Функція вікна реалізує один метод для зміни всіх параметрів стану вікна.

Ім’я функції вікна – це звичайне ім’я, яке визначається розробником. При реєстрації класу операційна система запам’ятовує покажчик на цю функцію.

Розглянемо приклад опису функціїї вікна.

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{static short cx, cy, left, top; //опис локальних змінних

switch (msg) //обробка повідомлення

{ case WM_CREATE:

{//…;

return 0;}

case WM_MOVE:

{left=LOWORD (lParam); top=HIWORD(lParam);

return 0;}

case WM_SIZE:

{cx=LOWORD(lParam); cy=HIWORD(lParam);

return 0;}

case WM_COMMAND: //обробляємо команди

{switch (LOWORD (wParam))

{case CM_FILE_EXIT:

{DesrtoyWindow(hwnd);

return 0;}

//Далі можуть бути гілки інших команд}

return 0;}

case WM_DESTROY:

{ //…;

PostQuitMessage(0);

return 0;} }

return DefWindowProc(hwnd,msg,wParam,lParam);}

Заголовок функції визначений погодженнями Windows і має вигляд

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

Тип повернення LRESULT рівноцінний типу signed long. Модифікатор CALLBACKвказує на погодження про те, що ця функція викликається операційною системою (такі функції називають функціями зворотнього виклику).

Імена типів UINT, WPARAM, LPARAM описані так:

typedef unsigned int UINT;

typedef UINT WPARAM;

typedef LONG LPARAM;

Параметр hwnd – дескриптор вікна-адресата, а msg, wParam s lParam описують одержане повідомлення. Параметр msg приймає код повідомлення.

Розглянемо, яким повідомленням відповідають використовувані в прикладі коди повідомлення. В Windowsописано декілька сотень кодів повідомлень з префіксом WM_. Код повідомлення супроводжують параметриwParamіlParam, які містять дані повідомлення. Для кожного коду повідомлення системою визначені допустимі значення кода повернення, і одне з цих значень повинна повернути функція вікна, якщо вона обробила повідомлення.

Код WM_CREATE надходить від функції CreateWindow перед створенням вікна. Функція вікна одержує код WM_SIZE після зміни розмірів вікна, а WM_MOVE – після переміщення лівого верхнього кута робочої області вікна. Якщо при зміні розмірів вікна змінились координати лівого верхнього кута робочої області, то функція вікна спочатку одержує код WM_MOVE, а потім – WM_SIZE. Після зміни режиму відображення вікна функція вікна одержує код WM_SIZE, потім – WM_MOVE. Функція вікна одержує код WM_COMMAND при надходженні команди. Тоді молодше слово параметраwParamмістить код команди. Розробник свої повідомлення часто зв’язує з командами меню і описує ідентифікатори для цих команд. Код WM_DESTROY функції вікна надсилають перед руйнуванням вікна. В прикладі функція вікна, викликаючи функцію DestroyWindow, сама собі надсилає повідомлення WM_DESTROY. При надходженні кода WM_MOVE параметр lParam містить екранні координати лівого верхнього кута робочої області. Для кода WM_SIZE параметр lParam несе інформацію про ширину cx і висоту cy робочої області. При надходженні повідомлень від миші відстань позиції курсора миші від лівого края робочої області дорівнює LOWORD(lParam), а від верхнього края - HIWORD(lParam).

Якщо функція вікна обробляє код повідомлення, то потрібно повернути визначене системою для цього коду значення!