Предмет:
Тип роботи:
Лабораторна робота
К-сть сторінок:
25
Мова:
Українська
покажчиком на рядок, що закінчується нулем, у якому містяться параметри, передані програмі з командного рядка.
- Параметр iCmdShow визначає, як додаток первісно відображається на дисплеї: піктограмою (iCmdShow = SW_SHOWMINNOACTIVE) чи у виді відкритого вікна (iCmdShow = SW_SHOWNORMAL).
Виходить, для початку необхідно створити функцію WinMain (). Для чого у файл sample. cpp додаємо наступний код:
#include <windows. h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
}//кінець WinMain
2.3. Реєстрація класу вікна
Як уже говорилося, найважливіша задача функції WinMain – створення основного вікна програми, з яким повинний бути зв'язаний код, здатний обробляти повідомлення, передані операційною системою цьому вікну.
Звичайний додаток створює вікно за два кроки. Спочатку за допомогою функції RegisterClass реєструється клас вікна, а потім створюється саме вікно зареєстрованого класу за допомогою функції CreateWindow.
Клас вікна визначає загальне поводження нового типу вікон, включаючи адресу нової віконної процедури. Такі другорядні аспекти як розмір, розташування і зовнішній вигляд вікна визначаються при його створенні.
Новий клас вікна реєструється при виклику додатком наступної функції:
ATOM RegisterClass (const WNDCLASS *lpwc) ;
Єдиний параметр цієї функції lpwc указує на структуру типу WNDCLASS, що описує тип нового вікна. Значення, що повертається, є атомом Windows – 16-розрядним значенням, що ідентифікує унікальний символьний рядок у таблиці Windows.
Додамо до функції WinMain код, у якому здійснюється заповнення полів структури, що описує і реєструє клас вікна:
…
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = «HelloWin»;
WNDCLASS wndclass;
// Заповнення структури WNDCLASS для реєстрації класу вікна.
wndclass. style = CS_HREDRAW | CS_VREDRAW;
wndclass. lpfnWndProc = WndProc;
wndclass. cbClsExtra = 0;
wndclass. cbWndExtra = 0;
wndclass. hInstance = hInstance;
wndclass. hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass. hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass. hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass. lpszMenuName = NULL;
wndclass. lpszClassName = szAppName;
RegisterClass (&wndclass) ;
}//кінець WinMain
Поля структури 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