Основні терміни та визначення, Додатки, DLL, COM, ActiveX, C / C + +, статті

Як правило, програми, написані для Windows, використовують вікна для
організації призначеного для користувача інтерфейсу. З цього правила можуть бути
винятки, але в переважній більшості випадків програмістові доводиться
працювати з вікнами.

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

При запуску вашого застосування, Windows створює для нього чергу повідомлень.
Черга повідомлень створюється для кожного потоку (thread), але в самому простому
випадку створюється одна черга.

При будь-якій дії з вікном (зміна розмірів і т.д.) Windows поміщає в
чергу відповідне повідомлення. Формат повідомлення відповідає структурі MSG.

Структура MSG:

typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;


Хендл вікна – Число ідентифікує вікно. У кожного вікна в Windows
є свій хендл. Практично у всіх функціях API потрібно вказувати хендл
вікна.

Повідомлення поміщаються в чергу повідомлень необхідно правильно витягувати і
обробляти. Для цього потрібно побудувати цикл обробки повідомлень.

Цикл обробки повідомлень:

MSG msg;

while(GetMessage(&msg,0,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}


Розглянемо функцію GetMessage ():

BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);

Функція GetMessage () витягує повідомлення з черги повідомлень і поміщає його
в структуру lpMsg типу MSG. Якщо повідомлень в черзі немає, то поточний потік
переводиться в стан очікування і достроково віддає управління іншим потокам.

Значення, що повертається:

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

Якщо функція витягує повідомлення WM_QUIT, то вона повертає 0.

Якщо сталася помилка, то функція повертає -1.


Розглянемо функцію TranslateMessage():

BOOL TranslateMessage(CONST MSG *lpMsg);

Функція TranslateMessage () транслює повідомлення від клавіатури. Вона переводить
повідомлення віртуальних клавіш (Virtual-key) в символьні повідомлення.

Розглянемо функцію DispatchMessage():

LONG DispatchMessage(CONST MSG *lpmsg);

Функція DispatchMessage () відправляє повідомлення у віконну процедуру. По суті
ця функція і викликає віконну процедуру.

Віконна процедура


Віконна процедура – функція обробки подій (повідомлень). Вона викликається
самою операційною системою Windows і отримує ряд параметрів: хендл вікна –
hWnd, код повідомлення – msg і два параметри lParam і wParam. Віконна процедура
може мати будь-яке ім’я. У нашій програмі ми назвемо її WndProc.

/ * Прототип * /
LRESULT CALLBACK WndProc(
HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
);

Віконна процедура повинна вміти обробляти всі повідомлення, але в Windows таких
повідомлень десятки тисяч. Всі зводитися до того, що ваша віконна процедура буде
обробляти тільки необхідні для вас повідомлення, а всі інші повідомлення
оброблятиме віконна процедура за умовчанням – DefWindowProc ();

/ * Приклад віконної процедури * /

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch(msg)
{

case WM_DESTROY:
/ / Поставити повідомлення WM_QUIT в чергу повідомлень
PostQuitMessage(0);
break;

default:
/ / Віконна процедура за умовчанням
return DefWindowProc(hWnd,msg,wParam,lParam);
}

return 0;
}


Ця віконна процедура обробляє тільки одне повідомлення – WM_DESTROY, все
інші повідомлення обробляє віконна процедура за умовчанням.

Зауваження. Повідомлення WM_DESTROY надсилається вікна, коли користувач намагається
закрити вікно.

Віконна процедура обробляє повідомлення для вікон певного класу.

Класи вікон, реєстрація нового класу


Віконний клас – клас, на основі якого створюються вікна. На базі одного
віконного класу можна створити декілька вікон. В ОС Windows є зумовлені
класи вікон, такі як: кнопки, списки, що розкриваються, смужки прокрутки і т.д.
Для того щоб створювати вікна на основі вашого класу, останній повинен бути
зареєстрований в системі функцією RegisterClass () або RegisterClassEx ().

Для того щоб використовувати ваш власний клас вікон, вам необхідно
заповнити структуру WNDCLASSEX.

Структура WNDCLASSEX:

typedef struct _WNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;


Після заповнення структури WNDCLASSEX, клас необхідно зареєструвати в
системі. Це робиться за допомогою функції RegisterClassEx ();

WNDCLASSEX wc;

/ / Заповнюємо структуру WNDCLASS
// ….
/ / Реєструємо новий клас
RegisterClassEx(&wc);


Тепер, коли наш клас зареєстрований в системі, ми можемо створювати вікна
нашого класу.

Створення вікна


Створення вікна проводитися за допомогою функції CreateWindow () або
CreateWindowEx().

У разі успіху функція CreateWindow () повертає хендл нового створеного
вікна, інакше функція повертає NULL.

HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
LPVOID lpParam
);


Після створення вікна його необхідно відобразити на екрані. Щоб вікно було
показано на екрані необхідно викликати функцію ShowWindow ().

ShowWindow(hWnd, SW_SHOW);

Шаблон

/*
Шаблон програми для windows
http://proger.h10.ru
*/

#include <windows.h>

/ / Оголошення віконної процедури
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,
WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int iCmdShow)
{
const char szClassName [] = “MyApp”; / / Ім’я віконного класу
WNDCLASSEX wc;
MSG msg;
HWND hWnd;

/ / Заповнюємо поля структури wc
wc.cbSize = sizeof (wc); / / Розмір структури wc
wc.cbClsExtra = 0; / / додаткова пам’ять для класу
wc.cbWndExtra = 0; / / додаткова пам’ять для вікна
wc.hbrBackground = CreateSolidBrush (RGB (135,163,187)); / / Колір фону вікна
wc.hCursor = LoadCursor (0, IDC_ARROW); / / Визначаємо курсор миші
wc.hIcon = LoadIcon (hInstance, IDI_APPLICATION); / / Іконка
wc.hIconSm = LoadIcon (hInstance, IDI_APPLICATION); / / Маленька іконка
wc.hInstance = hInstance; / / хендл екземпляра додатку
wc.lpfnWndProc = WndProc; / / Ім’я віконної процедури
wc.lpszClassName = szClassName; / / Ім’я віконного класу
wc.lpszMenuName = NULL; / / Ім’я меню
wc.style = CS_HREDRAW | CS_VREDRAW; / / Стиль

/ / Реєстрація нового віконного класу
if(!RegisterClassEx(&wc))
{
MessageBox (NULL, “Не можу зареєструва клас”, “Помилка”, MB_OK | MB_ICONSTOP);
return -1;
}

/ / Створення вікна
hWnd = CreateWindow (szClassName, / / ​​Ім’я віконного класу
“Моє вікно”, / / ​​Заголовок вікна
WS_OVERLAPPEDWINDOW, / / ​​Стиль вікна
CW_USEDEFAULT, / / ​​Координата x
CW_USEDEFAULT, / / ​​Координата y
CW_USEDEFAULT, / / ​​Ширина вікна
CW_USEDEFAULT, / / ​​Висота вікна
0, / / ​​Хендлі вікна батька
NULL, / / ​​Хендлі меню
hInstance, / / ​​Хендлі екземпляра додатку
NULL); / / Додаткові параметри

if(hWnd==NULL)
{
MessageBox (NULL, “Не можу створити нове вікно”, “Помилка”, MB_OK | MB_ICONSTOP);
return -1;
}

ShowWindow (hWnd, SW_SHOW); / / Вікно повинне бути показано
UpdateWindow (hWnd); / / Віконної процедурі надсилається повідомлення WM_PAINT

/ / Цикл обробки повідомлень
while (GetMessage(&msg,0,0,0))
{
TranslateMessage (& msg); / / Повідомлення від клавіатури
DispatchMessage (& msg); / / Запуск віконної процедури
}

return 0;
}

/ / Віконна процедура

LRESULT CALLBACK WndProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;

switch(msg)
{

case WM_PAINT:
{
hDC=BeginPaint(hWnd,&ps);

/ / Щось малюється

EndPaint(hWnd,&ps);
}
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}

return 0;
}


(Шаблон програми під
Windows). Visual C 6.0.

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


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

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

Ваш отзыв

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

*

*