Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Клас вікон






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

Набір використовуваних ресурсів класа вікон задають в структурі типу 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).

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

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал