Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ІК (Говорущенко) Методичка.doc
Скачиваний:
6
Добавлен:
23.02.2016
Размер:
762.88 Кб
Скачать

Головна функція додатку

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

Приклад опису функції WinMain:

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow)

{ MSG msg; HWND hwnd;

if (!RegClass (WndProc,szClassName)) return FALSE;

hwnd=CreateWindow(szClassName, “Приклад”, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL);

if (!hwnd) return FALSE;

ShowWindow(hwnd, SW_SHOWMAXIMIZED);

UpdateWindow(hwnd);

while(GetMessage (&msg, NULL, 0, 0))

{TranslateMessage(&msg); DispatchMessage(&msg);}

return (int) msg.wParam;}

Ім’я, тип повернення і список формальних параметрів функції визначені вимогами Win32API.

Параметр hInstance від операційної системи одержує дескриптор поточного екземпляра додатку.

Повідомлення msgпредставляє собою структуру типуMSG:

typedef struct

{HWND hwnd; //дескриптор вікна-адресату

UINT message; //код повідомлення

WPARAM wParam; //дані повідомлення

LPARAM lParam; //дані повідомлення

DWORD time; //час відправки

POINT pt; //координати курсору в момент відправки

} MSG;

Функція GetMessage обирає повідомлення з черги повідомлень додатку, TranslateMessage транслює клавіатурні повідомлення, DispatchMessage розподіляє повідомлення за функціями вікон. Саме тут відбувається “виклик” функції вікна.

Функція ShowWindow оголошена наступним чином:

BOOl ShowWindow(HWND hwnd, int nCmdShow);

Функція GetMessageмає наступний прототип:

BOOL GetMessage (LPMSG lpmsg, HWND hwnd, WORD uMsgFilterMin, WORD uMsgFilterMax);

Функція GetMessageобране повідомлення видаляє з черги і записує в структуру, адреса якої задана її першим аргументом. При виборі повідомлення з кодомWM_QUITвона повертає 0 і цикл обробки повідомлень завершується. Інакше функціяGetMessageповертає ненульове значення. Після цьогоWinMainповертає управління і значення поляwParamостаннього повідомлення операційній системі, інакше вона повинна повернути 0.

Структура тексту додатку

Структура тексту додатку визначається двома вимогами:

  1. Текст містить опис функції з іменем WinMain;

  2. Якщо реєструються нові класи, то текст містить опис структури типу WNDCLASS і функцій вікон цих класів.

Наступний додаток (лістинг 1.1) реєструє клас вікон, що перекриваються, створює вікно цього класу і передає управління циклу обробки повідомлень. Проект додатку містить декілька частин.

  1. В окремому файлі (Functions.cpp)описанофункцію RegClass. Текст файлу Functions.cpp:

#include “Functions.h”

BOOL RegClass (WNDPROC Proc, LPCTSTR szName, UINT brBackground)

{ WNDCLASS wc;

wc.style=0;

wc.cbClsExtra=wc.cbWndExtra=0;

wc.lpfnWndProc=Proc;

wc.hInstance=hInstance;

wc.hIcon=LoadIcon(NULL, IDI_APPLICATION;

wc.hCursor=LoadCursor(NULL, IDC_ARROW);

wc.hbrBachground=(HBRUSH) (brBackground+1);

wc.lpszMenuName=(LPCTSTR) NULL;

wc.lpszClassName=szName;

return (RegisterClass(&wc)!=0);}

  1. Тут використовується файл заголовків Functions.h:

#include <windows.h>

extern HINSTANCE hInstance;

//Оголошення функцій

BOOL RegClass(WNDPROC LPCTSTR, UINT);

  1. В файлі Extmpl11.cpp описані головні змінні і функції:

#include “Functions.h”

//оголошення функцій

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

//опис глобальних змінних

HINSTANCE hInstance;

Char szClassName[]=”WindowAppClass”;

//опис головної функції

INT WINAPI WinMain (HINSTANCE hInst, HINSTANCE, PSTR, INT nCmdShow)

{ MSG msg; HWND hwnd; hInstance=hInst;

if (!RegClass(WndProc, szClassName,COLOR_WINDOW)) return FALSE;

hwnd=CreateWindow(szClassName, “Приклад”,

WS_OVERLAPPEDWINDOW|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL);

if (!hwnd) return FALSE;

while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg);

return (int) msg.wParam;}

//опис функції вікон

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

{ switch(msg)

{case WM_DESTROY:

{PostQuitMessage(0);

return 0; }}

return DefWindowProc(hwnd, msg, wParam, lParam);}

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

Розглянемо алгоритм роботи цього додатку:

  1. класи вікон реєструють на початку роботи додатку;

  2. вікно додатку створюють до передачі управління циклу обробки повідомлень;

  3. відсутні виклики функцій ShowWindow s UpdateWindow. Це обумволено тим, що вікно створене зі стилем WS_VISIBLE. В такому випадку функціяCreateWindow надсилає всі повідомлення, які необхідні для відображення створеного вікна і перемалювання його робочої області;

  4. управління передають циклу обробки повідомлень. В тілі цього циклу обираються і розподіляються повдомлення;

  5. функція вікна обробляє повідомлення WM_DESTROY, а останні повідомлення повертає системі. Функція вікна додатку повинна обробляти це повідомлення;

  6. додаток завершує роботу.

Може здаватися, що відображення і видалення вікна – надто проста задача для такого “складного” тексту. Проаналізуємо, що ж насправді може зробити цей додаток.Стиль повністю визначає зовнішню поведінку вікна. Завдяки стилю WS_OVERLAPPEDWINDOW вікно містить подвійні рядки зміни розмірів і заголовок, в області заголовка розташовані системне меню і кнопки для згортання, відновлення розмірів і закриття вікна. За допомогою цих елементів можна переміщати вікно, змінювати його розміри, згортати вікно в піктограму, відновлювати і закривати вікно.

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