
- •Приклад створення типового Windows-додатка
- •1. Робота з компілятором
- •2.2 Точка входу в програму
- •Int winapi WinMain (hinstance hInstance, hinstance hPrevInstance,
- •2.3 Реєстрація класу вікна
- •Поля структури wndclass:
- •2.4 Створення вікна
- •2.5 Відображення вікна
- •2.6 Цикл обробки черги повідомлень
- •2.7 Віконна процедура
- •2.8 Обробка повідомлень
- •2.9 Повідомлення wm_paint
- •2.10 Видалення вікна, повідомлення wm_destroy
- •Практична частина
- •Контрольні питання :
Поля структури wndclass:
1) Назва нового реєструємого класу вікон задається за допомогою параметра-рядка lpszClassName.
2) Параметр lpfnWndProc вказує адресу функції віконної процедури. Ця функція відповідає за обробку всіх повідомлень, одержуваних вікном. Вона може обробляти ці повідомлення сама чи викликати віконну процедуру за замовчуванням DefWindowProc.
Повідомлення можуть бути різноманітними: зміна розміру і переміщення вікна, події від миші, клавіатури, команди меню, запити на перемальовування, події від таймера й іншого апаратного забезпечення і т.д.
3) Деякі глобальні характеристики вікна керуються через параметр стилю вікна – style. Для цього параметра можна установити комбінацію значень, використовуючи операцію порозрядного АБО.
Значення CS_HREDRAW і CS_VREDRAW указують, що вікно повинне перемальовуватися цілком щораз при зміні горизонтального чи вертикального розміру.
4) Поле hIcon – дескриптор піктограми, використовуваної для представлення мінімізованих вікон цього класу (можливі варіанти: IDI_APPLICATION, IDI_ASTERISK, IDI_EXCLAMATION, IDI_HAND, IDI_QUESTION, IDI_WINLOGO);
5) Поле hCursor – дескриптор стандартного покажчика миші для вікон цього класу (можливі варіанти: IDC_APPSTARTING, IDC_ARROW, IDC_CROSS, IDC_IBEAM, IDC_NO, IDC_SIZEALL, IDC_SIZE IDC_SIZENESW, IDC_SIZENSIDC_SIZENWSE, IDC_SIZEWE, IDC_UPARROW, IDC_WAIT);
6) hbrBackground – дескриптор кисті інтерфейсу GDI, використовуваної для малювання фона вікна;
7) Рядок lpszMenuName визначає ресурс меню (по імені чи за допомогою макросу MAKEINTRESOURCE по цілому ідентифікаторі), що використовується для стандартного меню цього класу;
8,9) Параметри cbClsExtra і cbWndExtra використовуються, щоб виділити додаткову пам'ять для класу вікна і для окремих вікон, через них задається розмір цієї додаткової пам'яті. Додаток може використовувати цю додаткову пам'ять для збереження спеціальної інформації додатка, що відноситься до класу вікна чи до окремих вікон.
10) hInstance – дескриптор екземпляра додатка.
2.4 Створення вікна
Реєстрація нового класу є першим кроком у створенні вікна. Потім додаток повинен створити саме вікно за допомогою функції CreateWindow, що повертає дескриптор створеного вікна типу HWND:
HWND CreateWindow(LPCSTR lpClassName, LPCSTR lpWindowName,
DWORD dwStyle, int x, int y, int nWidth, int nHeight,
HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID *lpParam);
У кожного вікна в Windows мається унікальний дескриптор типу HWND. Для багатьох функцій Windows потрібно дескриптор вікна, завдяки якому Windows знає, до якого вікна застосувати функцію.
Додайте в програму sample.cpp фрагмент коду функції WinMain, у якому здійснюється створення вікна зареєстрованого раніше класу з ім'ям "HelloWin ":
…
static char szAppName[] = "HelloWin" ;
HWND hWnd;
WNDCLASS wndclass ;
…
RegisterClass(&wndclass) ;
hWnd = CreateWindow (szAppName, // ім'я класу
"The Hello Program", // Заголовок вікна
WS_OVERLAPPEDWINDOW, // Стиль вікна
CW_USEDEFAULT, // Ініціалізація положення по горизонталі
CW_USEDEFAULT, // Ініціалізація положення по вертикалі
CW_USEDEFAULT, // Ширина вікна
CW_USEDEFAULT, // Висота вікна
NULL, // Дескриптор батьківського вікна
NULL, // Дескриптор меню вікна
hInstance, // Дескриптор екземпляра програми
NULL) ;}// кінець WinMain
Параметри функції CreateWindow:
1) Перший параметр lpClassName вказує ім'я класу, поводження якого успадковує дане вікно. Цей клас повинен бути зареєстрований за допомогою функції RegisterClass.
2) Параметр lpWindowName визначає рядок, що виводиться в заголовку створюваного вікна.
3) Параметр dwStyle визначає стиль вікна. Не слід плутати стиль вікна зі стилем класу, переданим у RegisterClass через структуру WNDCLASS.
Хоча стиль класу визначає деякі постійні властивості вікон, що належать класу, стиль вікна, переданий CreateWindow, використовується для ініціалізації локальних властивостей вікна.
Як і у випадку стилю класу, стиль вікна також звичайно є комбінацією значень (об'єднаних операцією порозрядного АБО).
Зауваження. Для визначення стилю головного вікна найчастіше використовують стиль вікна, що перекривається, для чого через параметр dwStyle передають символічну константу WS_OVERLAPPEDWINDOW, визначену у файлах, що включаються, у такий спосіб:
#define
WS_OVERLAPPEDWINDOW (
WS_OVERLAPPED| \ //вікно що перекриває
WS_CAPTION|\ //вікно має рядок заголовка
WS_SYSMENU|\ //вікно має системне меню
WS_THICKFRAME| \ //вікно має товсту рамку
WS_MINIMIZEBOX|\ //кнопка мінімізації
WS_MAXIMIZEBOX) //кнопка максимізації
4-7) Після вказівки типу вікна потрібно задати початкові геометричні розміри вікна. Якщо при завданні параметрів x, y, nWidth і nHeight використовувати константу CW_USEDEFAULT, то Windows установить розташування і розміри вікна самостійно.
8) При створенні вікна вказуються також дескриптори його вікна-батька і меню. Якщо вікно є головним вікном додатка, то параметру hWndParent привласнюється значення NULL.
9) Значення NULL на місці дескриптора меню hMenu говорить про те, що у вікна буде тільки меню класу, загальне для усіх вікон цього класу.
10) При створенні вікна необхідно вказати екземпляр додатка, що створює вікно, що і робиться за допомогою параметра hInstance.
11) Останній параметр lpParam використовується для передачі вікну додаткових даних (якщо їх нема, то він повинний дорівнювати NULL). При необхідності цей параметр використовується як покажчик на які-небудь дані, на які програма надалі могла б посилатися.