- •Int winapi WinMain(hinstance hInstance, hinstance hPrevInstance,
- •Int winapi WinMain(hinstance hInstance, hinstance hPrevInstance,
- •Step 1: Реєстрація даних віконного класу
- •If(!RegisterClassEx(&wc))
- •Step 2: Створення вікна за занесеними даними
- •Step 3: Цикл чекання повідомлень
- •Step 4: Віконна процедура
Step 1: Реєстрація даних віконного класу
Операційна система реєструє дані віконного класу в спеціальній структурі типу WNDCLASSEX, яка буде доступною і операційній системі і програмі користувача. Частину даних заповнює користувач, а іншу – може заповнити операційна система за умовчуванням. Опис і заповнення структури виглядають так.
const char g_szClassName[] = "myWindowClass";
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
If(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
Записаний код розміщується в процедурі WinMain(). Заповнена структура реєструється операційн76ою системою через виклик системної функції RegisterClassEx().
Елементи структури мають наступні значення:
cbSize
розмір створеної віконної структури в байтах.
style
стиль вікна, зміст якого можна опустити поклавши значення параметру = 0.
lpfnWndProc
Покажчик на віконну процедуру.
cbClsExtra
параметр дістався у спадок від старих версій ОС, його можна покласти = 0.
cbWndExtra
те ж саме, що й попередній, покладіть= 0.
hInstance
Handle вашої програми, який повертає вам операційна система після реєстрації вікна (у списку параметрів WinMain()).
hIcon
іконка, розміром 32x32, яка появляється при натисканні Alt+Tab.
hCursor
форма, яку сприймає курсор при попаданні в область вікна.
hbrBackground
колір фону області вікна.
lpszMenuName
назва ресурсів меню головного вікна.
lpszClassName
назва вікна.
hIconSm
маленька іконка ( 16x16), що розміщується зліва і зверху вікна.
Step 2: Створення вікна за занесеними даними
Після того, як дані віконної структури заповнені, можна створювати вікно. Здійснюється це викликом системної функції CreateWindowEx() з параметрами, зміст яких описано нижче.
HWND hwnd;
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"The title of my window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
Перший параметр (WS_EX_CLIENTEDGE) вказує на те, що окантовка (бордюр) вікна повинен мати вдавлену форму. Помістіть на місце значення цього параметра значення 0 і ви побачите різницю.
Наступний параметр (g_szClassName) вказує на тип вікна, який система зареєструвала у цій змінній.. Наступним у списку параметрів іде назва вікна, що розміщується у заголовці вікна ("The title of my window").
Параметр WS_OVERLAPPEDWINDOW вказує на стиль вікна, що дозволяє перекриття.-
Наступні 4 параметри (CW_USEDEFAULT, CW_USEDEFAULT, 320, 240) це координати положення верхнього лівого кута вікна, та його розміри в пікселях (ширина і висота).
В наступних чотирьох (NULL, NULL, g_hInst, NULL) ми вказуємо хєндли батьківського вікна, мнню головного вікна, вашого екземпляра програми, та покажчик на блок додаткових віконних даних.
Приклад. Якщо в головному вікні ви створюєте кнопку, яка є також вікном, то батьківським вікном кнопки є головне вікно вашої програми. Якщо на місці хєндла стоїть NULL, то це значить, що у об’єкта нема предка. У нашого вікна також нема предка (там стоїть NULL). Це значить, що наше вікно є головним.. Нендл меню також = NULL Це значить, що вікно не має системи меню.
Хендл програми співпадає з параметром, що стоїть на першому місці у списку параметрів процедури WinMain.
Додатковою областю даних ми не користуємся (спадок попереднії версій ОС), тому на цьому місці ми також ставимо NULL. Значення NULL свідчить про невизначеність посилання на певну область даних. Якщо хендл екземпляра програми = NULL, то це значить, що ОС не змогла зареєструвати віконні дані і створити вікно. Цей результат потрібно передбачити і обслужити подібну подію , як це зроблено нижче.
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
Створене вікно потрібно намалювати в області екрану, і перевірити, що воно вміє перемальовуватись (UpdateWindow(hwnd).
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
nCmdShow має значення, встановлене за умовчуванням.
