Структура головної функції в мінімальному додатку

Мінімальна додаток Windows складається з 2 частин:

1 головної функції з імям WinMain, що включає цикл обробки повідомлень

2 віконної функції WndProc

Виконання будь-якого віконного програми починається з головної функції Вона містить код, який здійснює ініціалізацію додатки в операційній системі, за допомогою якого система дізнається про новий додатку і його властивості Для цього в WinMain описується і реєструється клас вікна програми, а потім створюється і відображається на екрані вікно додатка зареєстрованого класу Видимим для користувача результатом роботи головної функції є поява на екрані нового графічного обєкта вікна Останньою дією коду головної функції є створення циклу обробки повідомлень Після його створення додаток починає взаємодіяти з обчислювальної системою через повідомлення

Обробка ж надходять додатком повідомлень здійснюється за допомогою спеціальної функції, званої віконної Віконна функція унікальна тим, що може бути викликана тільки з операційної системи, а не з додатку, який її містить

Розглянемо структуру головної функції більш докладно На С мінімальна головна функція з одним вікном має вигляд:

int    WINAPI    WinMain(HINSTANCE    hlnst,     HINSTANCE,     LPSTR, int)

{   char  szClassName[]=&quotClass32"

/ / Довільний імя класу головного вікна char szTitleName [] = Приклад програми;

/ / Довільний заголовок вікна

MSG mess / / Структура для отримання повідомлень

WNDCLASS wc / / Структура для завдання характеристик / / вікна / / Реєстрація класу головного вікна

memset(&ampwc,0,sizeof(wc) ) / / Обнулення і формування необхідних елементів / / структури wc

wclpfnWndProc=WndProc / / Покажчик на віконну

/ / Функцію wchlnstance=hlnst // Дескриптор додатки wchIcon=LoadIcon(NULL,IDI_APPLICATION)

/ / Виклик функції завантаження стандартної піктограми

wchCursor=LoadCursor(NULL,IDC_ARROW) / / Виклик функції завантаження курсору миші – / / односпрямованої стрілки

wc hbrBackground=GetStockBrush (LTGRAY_BRUSH) / / Запит для зафарбовування фону вікна / / світло-сірої пензлем з ресурсів Windows

wclpszClassName=szClassName / / Імя класу вікна

RegisterClass(& Wc) / / Виклик функції реєстрації / / класу вікна / / Створимо головне вікно

HWND hwnd=CreateWindow(szClassName,szTitleName, / / Клас і заголовок вікна

WS_OVERLAPPEDWINDOW,20,20,300,200, / / ​​Стиль, х і у координати лівого верхнього кута, / / ​​ширина і висота вікна HWND_DESKTOP,NULL,hlnst,NULL)

/ / Дескриптор батьківського вікна, посилання на меню, / / ​​Дескриптор екземпляра додатку, адреса додаткових даних

/ / Покажемо вікно на екрані

ShowWindow(hwnd,SW_SHOWNORMAL) / / Організуємо цикл обробки повідомлень

while(GetMessage(&ampmess,NULL,0,0)) / / Отримати повідомлення

DispatchMessage(&ampmess) / / І передати віконної функції для обробки

return 0 / / Після виходу з циклу повернутися в Windows}

При запуску програми управління передається програмами ОС, які завантажують код додатку в память і викликають головну функцію, яка повинна мати імя WinMain і дескриптор WINAPI При виклику WinMain ОС передає їй 4 параметра Перший параметр типу HINSTANCE повинен бути дескриптором даного екземпляра додатку, необхідним для його ідентифікації Цей дескриптор використовується різними API-функціями, тому він повинен зберігатися в глобальній змінній У мінімальному додатку таких функцій немає, тому hlnst не зберігається ніде Другий параметр для 16-розрядних додатків являє собою дескриптор попереднього екземпляра додатку, а для 32-розрядних додатків не

має сенсу і приймає нульове значення Третій параметр є покажчиком на рядок, що містить параметри командного рядка при запуску програми Четвертий параметр WinMain служить для визначення режиму запуску програми Так, додаток можна відразу після запуску згортати в піктограму, що здійснюється при рівності 4 параметра 7 Якщо 4 параметр дорівнює 1, то вікно програми приймає розміри, зазначені при створенні дескриптора вікна Цей 4 параметр зазвичай передається другим параметром функції показу вікна ShowWindow У нашому прикладі ми відразу передали функції ShowWindow потрібну константу SWSHOWNORMAL, рівну 1

У додатку головна функція повинна спочатку зареєструвати в ОС клас головного вікна Якщо крім одного головного вікна планується виведення на екран дочірніх вікон, то їх класи також необхідно зареєструвати ОС виводить на екран і обслуговує тільки вікна зареєстрованих класів Клас вікна задає характеристики, загальні для всіх подібних вікон Дії програміста по реєстрації класу полягають у заповненні структури типу WNDCLASS, в якій зберігаються характеристики класу вікна Дані з цієї структури необхідні функції RegisterClass, яка і виконує власне реєстрацію Розглянемо структуру WNDCLASS

{

UINT style / / Стиль класу вікна

WNDPROC lpfnWndProc

/ / Покажчик на імя віконної функції int cbClsExtra

/ / Кількість байтів додаткової інформації / / о класі int cbWndExtra

/ / Кількість байтів додаткової інформації / / об вікні

HINSTANCE hlnstance / / Дескриптор додатка HICON hicon / / Дескриптор піктограми додатка HCURSOR hCursor / / Дескриптор курсору додатки HBRUSH hbrBackground / / Дескриптор кисті для фону вікна

LPCSTR IpszMenuName

/ / Покажчик на рядок з імям меню вікна

LPCSTR lpszClassName

/ / Покажчик на рядок з імям класу вікна

} WNDCLASS

Не всі поля структури необхідно заповнювати, тому структура спочатку обнуляється, а потім заповнюються тільки потрібні поля Нульове значення елемента структури, яка описує обєкт Windows (наприклад, структури типу WNDCLASS), означає, що реальне значення елемента буде встановлено за замовчуванням Через структуру WNDCLASS ОС визначає адресу віконної функції, яка викликається для обробки повідомлень

Стиль класу вікна являє собою ціле 32-бітове число, кожний біт якого дозволяє або забороняє можливість певних дій з вікном Так, 0 і 1 біти дозволяють / забороняють перерисовку вікна при зміні його розмірів, біт 3 відповідає за реакцію програми на подвійні клацання мишею в області вікна, біт 9 забороняє закриття вікна користувачем За кожен біт чи комбінацію відповідає зумовлена ​​константа, імя якої може бути використано для формування стилю класу вікна з операцією побітового АБО Прикладами констант, що визначають стиль класу вікна, є CSHREDRAW (перерисовка вікна при зміні його ширини), CSVREDRAW (перерисовка вікна при зміні висоти), CSNOCLOSE (заборона команди закриття вікна в системному меню) У нашому мінімальному додатку створення свого стилю вікна не потрібно

Курсор і піктограма є ресурсами Windows Ресурси зазвичай завантажуються з файлу ресурсів за допомогою спеціальних функцій завантаження ресурсів, наприклад, для завантаження курсору використовується LoadCursor Як перший аргумент функції завантаження ресурсів вказується дескриптор додатка, в якому зберігається необхідний ресурс, а в якості другого імя ресурсу При цьому необовязково користуватися ресурсами додатків, можна використовувати ресурси Windows Для цього першим параметром функції LoadCursor вказується NULL, що означає саму Windows, а другий параметр вибирається зі списку вбудованих ресурсів Так, для курсора-односпрямованої стрілки імя ресурсу IDCARROW, для курсора вертикальної двобічної стрілки IDCSIZENC За допомогою функції Load Icon завантажується піктограма додатка, також обирається, зі стандартних ресурсів Windows Для формування кисті, визначальною зафарбовування фону вікна, використовується одна із зумовлених кистей Windows Можна встановити свою кисть, використавши виклик види:

wchbrBackground=CreateSolidBrush(RGB(100,70,150))

де аргументом CreateSolidBrush є колір кисті, упаковують в 4 байта за допомогою макросу RGB, аргументами якої служать інтенсивності трьох складових кольору

Після реєстрації класу вікна необхідно створити головне вікно і показати його на екрані Породжені вікна теж необхідно перед показом створити, причому необовязково в WinMain Створення вікна здійснюється за допомогою функції CreateWindow, що має наступні параметри:

– адреса рядка з імям реєстрованого класу Відзначимо, що імя класу може бути наперед визначеним для вікон, що реалізують елементи управління Клас BUTTON служить для формування кнопок, груп, прапорців і перемикачів, клас LISTBOX служить формування списку рядків, клас EDIT для формування поля редагування при введенні тексту, клас STATIC для розміщення у вікні тексту, клас SCROLLBAR для формування смуги прокрутки

– адреса рядка з заголовком вікна

– стиль вікна, що визначає вигляд вікна при показі, наприклад, вид рамки, наявність заголовка, кнопок, рамки і тп Стиль це 32-бітове число, біти якого несуть смислове навантаження за визначенням конкретних властивостей вікна при відображенні Для того щоб вказати для вікна набір властивостей, використовують побітовое АБО для констант, що визначають те чи інше властивість Зазвичай головне вікно описується за допомогою константи WSOVERLAPPEDWINDOW (OxOOCFOOOOh), яка одночасно вказує на можливість перекриття вікна, наявність рядка заголовка, системного меню, рамки, кнопки згортання і кнопки розгортання вікна, що забезпечується операцією побітового АБО між константами WSOVERLAPPED, WSCAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX

– x і у координати лівого верхнього кута вікна щодо початку екрану

– розміри вікна в пікселах по горизонталі і вертикалі

– дескриптор батьківського вікна Для головного вікна будемо вважати, що його батьком є ​​робочий стіл, що має дескриптор HWNDDESKTOP

– дескриптор меню вікна Якщо його немає або використовується меню класу, вказується NULL

– Дескриптор додатки, отриманий через перший аргумент
функції WinMain

– Адреса додаткових даних, необхідних для створення вікна
Якщо створення вікна пройшло успішно, то функція CreateWindow

повертає дескриптор створеного вікна, який передається у функцію ShowWindow, що виводить вікна на екран

Наприкінці функції WinMain необхідно організувати цикл обробки повідомлень, що надходять в додаток Робота цього циклу і тим самим додатки здійснюється доти, поки користувач не завершить програму При цьому WinMain завершується і віддаляється зі списку активних завдань

У найпростішому випадку цикл обробки повідомлень складається з виклику функції GetMessage, і, якщо вона повертає нульове значення, викликається функція DispatchMessage Якщо в черзі потоку зявляється повідомлення, то функція GetMessage забирає його з черги і переносить в структуру mess

Як параметри функції GetMessage зазначаються:

– адреса структури mess, в яку надходить взяте з черги повідомлення,

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

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

Особлива ситуація виникає, коли GetMessage виявляє в черзі повідомлення WMQUIT з кодом 0x12 У цьому випадку функція завершується з поверненням 0, що завершує цикл обробки повідомлень

Функція DispatchMessage викликає віконну функцію вікна того класу, якому призначено повідомлення і передає їй вміст повідомлення через структуру mess Після обробки повідомлення віконної функцією управління повертається в цикл обробки повідомлень (малюнок 12)

WinMain

цикл обробки

GetMe:

чергу потоку

повідомлення

Малюнок 12-Логіка обробки повідомлень в додатку

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*