- •Хмельницький національний університет проектування інтерфейсів користувача
- •Хмельницький 2009
- •Лабораторна робота №1
- •І. Теоретичні відомості
- •Для розробника вікно є сукупністю великої кількості елементів, які функціонують під управлінням додатку та операційної системи.
- •Створення вікон
- •Головна функція додатку
- •Структура тексту додатку
- •Допоміжні функції створення вікон
- •Приклади створення вікон
- •IV. Контрольні питання
- •Лабораторна робота №2
- •І. Теоретичні відомості
- •Статичний орган управління
- •Смуги прокрутки
- •IV. Контрольні питання
- •Лабораторна робота №3
- •І. Теоретичні відомості
- •Списки рядків
- •Комбінований список
- •IV. Контрольні питання
- •Лабораторна робота №4
- •І. Теоретичні відомості
- •Повідомлення wm_paint
- •Види контексту відображення
- •Встановлення атрибутів контексту відображення
- •Вивід тексту
- •Малювання геометричних фігур
- •IV. Контрольні питання
- •Лабораторна робота №5
- •І. Теоретичні відомості
- •Інструменти малювання
- •Відображення графічних об'єктів
- •IV. Контрольні питання
- •Лабораторна робота №6
- •І. Теоретичні відомості
- •Створення меню
- •Повідомлення від меню
- •Плаваюче меню
- •Акселератори
- •IV. Контрольні питання
- •Література
Головна функція додатку
Додатки завжди описують функцію з ім’ям 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.
Структура тексту додатку
Структура тексту додатку визначається двома вимогами:
Текст містить опис функції з іменем WinMain;
Якщо реєструються нові класи, то текст містить опис структури типу WNDCLASS і функцій вікон цих класів.
Наступний додаток (лістинг 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);}
Тут використовується файл заголовків Functions.h:
#include <windows.h>
extern HINSTANCE hInstance;
//Оголошення функцій
BOOL RegClass(WNDPROC LPCTSTR, UINT);
В файлі 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);}
Відмінність від звичних програм міститься в заголовку головної функції, в специфічній функції вікна і в способі її виклику.
Розглянемо алгоритм роботи цього додатку:
класи вікон реєструють на початку роботи додатку;
вікно додатку створюють до передачі управління циклу обробки повідомлень;
відсутні виклики функцій ShowWindow s UpdateWindow. Це обумволено тим, що вікно створене зі стилем WS_VISIBLE. В такому випадку функціяCreateWindow надсилає всі повідомлення, які необхідні для відображення створеного вікна і перемалювання його робочої області;
управління передають циклу обробки повідомлень. В тілі цього циклу обираються і розподіляються повдомлення;
функція вікна обробляє повідомлення WM_DESTROY, а останні повідомлення повертає системі. Функція вікна додатку повинна обробляти це повідомлення;
додаток завершує роботу.
Може здаватися, що відображення і видалення вікна – надто проста задача для такого “складного” тексту. Проаналізуємо, що ж насправді може зробити цей додаток.Стиль повністю визначає зовнішню поведінку вікна. Завдяки стилю WS_OVERLAPPEDWINDOW вікно містить подвійні рядки зміни розмірів і заголовок, в області заголовка розташовані системне меню і кнопки для згортання, відновлення розмірів і закриття вікна. За допомогою цих елементів можна переміщати вікно, змінювати його розміри, згортати вікно в піктограму, відновлювати і закривати вікно.
Функційні можливості вікна могли б бути й ширше. Це вікно приймає всі повідомлення від користувача, системи та інших вікон. Тобто воно готове співпрацювати з користувачем і відкрити доступ до ресурсів системи. Але опис функції вікна містить обробку лише одного повідомлення. Останні повідомлення вона не обробляє і передає системі. По суті, вони видаляються з черги повідомлень.