- •Хмельницький національний університет проектування інтерфейсів користувача
- •Хмельницький 2009
- •Лабораторна робота №1
- •І. Теоретичні відомості
- •Для розробника вікно є сукупністю великої кількості елементів, які функціонують під управлінням додатку та операційної системи.
- •Створення вікон
- •Головна функція додатку
- •Структура тексту додатку
- •Допоміжні функції створення вікон
- •Приклади створення вікон
- •IV. Контрольні питання
- •Лабораторна робота №2
- •І. Теоретичні відомості
- •Статичний орган управління
- •Смуги прокрутки
- •IV. Контрольні питання
- •Лабораторна робота №3
- •І. Теоретичні відомості
- •Списки рядків
- •Комбінований список
- •IV. Контрольні питання
- •Лабораторна робота №4
- •І. Теоретичні відомості
- •Повідомлення wm_paint
- •Види контексту відображення
- •Встановлення атрибутів контексту відображення
- •Вивід тексту
- •Малювання геометричних фігур
- •IV. Контрольні питання
- •Лабораторна робота №5
- •І. Теоретичні відомості
- •Інструменти малювання
- •Відображення графічних об'єктів
- •IV. Контрольні питання
- •Лабораторна робота №6
- •І. Теоретичні відомості
- •Створення меню
- •Повідомлення від меню
- •Плаваюче меню
- •Акселератори
- •IV. Контрольні питання
- •Література
IV. Контрольні питання
Чим відрізняється текст додатку, який створює вікно, від тексту додатку, який не створює вікон?
Який алгоритм роботи головної функції додатку?
Які дії повинен виконати додаток для створення вікна?
Опис яких програмних об’єктів потрібно включити в текст додатку для реєстрації класу вікон?
В якому місці і як відбувається виклик функції вікна?
Яке призначення формальних параметрів функції вікна?
Лабораторна робота №2
Тема: Органи управління. Кнопки. Статичний орган управління. Смуга прокрутки.
Мета: Знайомство зі створенням органів управління з точки зору мови програмування, зі створенням кнопок, статичного органу управління, смуг прокрутки.
І. Теоретичні відомості
Органи управління
Для діалога з користувачем застосовують спеціальні вікна. Система описує декілька класів стандартних вікон – органів управління. Це добре відомі кнопки, статичні органи, списки, редактори, комбіновані списки, смуги прокрутки. Крім них, операційна система описує класи панель інструментів і рядок стану, які будуть розшлядатись пізніше (л.р.№7).
Відмінні риси органів управління:
для них вже описані класи вікон;
всі вони дочірні вікна (стилю WS_CHILD);
для них описані додаткові стилі і списки оброблюваних і одержуваних повідомлень;
для них майже завжди потрібно описувати ідентифікатори.
Батьківське вікно від дочірніх вікон одержує повідомлення. Повідомлення містить ідентифікатор дочірнього вікна-відправника повідомлення. І функція батьківського вікна завжди може визначити це дочірнє вікно.
Список імен розглядуваних в л.р.№2, л.р.№3 класів та їх повідомлення перераховані в табл.2.1.
Таблиця 2.1.Список органів управління
Клас |
Пояснення |
Повідомлення батьківському вікну |
BUTTON |
Вікно, стан якого змінюється рпи виборі і натсиканні. Це кнопки, які натискаються (push button – звичайні кнопки з текстом), перемикачі (radio button – кола з текстом, розташовним ліворуч або праворуч), прапорці (check box – прямокутники з текстом, розташованим ліворуч або праворуч) |
WM_COMMAND |
COMBO BOX |
Орган управління, що складається з списку та поля вибору. Список може бути згорнутий або розгорнутий. Якщо список розгорнутий, при вводі символів в полі вибору список встановлює в початок перше входження найбільш схожого рядку списку |
WM_COMMAND |
EDIT |
Вікно введення тексту з клавіатури чи редактор |
WM_COMMAND |
LISTBOX |
Список символьних рядків. При перегляді в кожен момент підсвічується один рядок і про неї передається повідомлення батьківському вікну |
WM_COMMAND |
SCROLLBAR |
Смуга прокрутки – прямокутник з повзунком і стрілками напрямку в обидва кінці. Батьківське вікно забезпечує калібровку і встановлення позиції повзунка. Смуга прокрутки має такі ж вигляд і функцію, як і смуги прокрутки вікна, але може з’явитись де завгодно. Спеціальний їх різновид може забезпечувати зміну розмірів вікна. |
WM_HSCROLL або WM_VSCROLL |
STATIC |
Текстове поле, прямокутник виділення та інші елементи оформлення |
WM_NCHITTEST |
Кнопки
Створення кнопок. Для створення кнопки викликають функцію CreateWindow. Її виклик для створення кнопки має наступні особливості:
в якості lpClassName вказують ім’я класу BUTTON;
аргумент lpWindowNameвизначає текст на кнопці;
аргумент dwStyleзадає стиль кнопки. Його значення задають комбінацією контсантиWS_CHILD, константи з префіксомBS_ (табл.2.2) і, майже завжди, константиWS_VISIBLE. Можна вказувати лише одну константу з табл.2.2. Виключенням єBS_LEFTTEXTтаBS_RIGHTBUTTON. Їх використовують сумісно з іншими константами табл.2.2 для створення прапорців і перемикачів з текстом ліворуч;
значення hWndParent визначає батьківське вікно, в робочій області якого створюється кнопка. Дескриптор вікна-батька вказується обов’язково;
значення hMenuповинно бути рівне ідентифікатору кнопки;
для органів управління в якості lpParamвказуютьNULL.
Таблиця 2.2. Список стилів кнопок
Стилі |
Пояснення |
1 |
2 |
BS_3STATE |
Прапорець, який може знаходитись в ввімкненому, вимкненому та невизначеному стані |
BS_AUTO 3STATE |
Те ж, що й BS_3STATE, але вигляд квадратика автоматично змінюється при перемиканні, циклічно відображуючи ввімкнений, вимкнений і неактивний стан |
BS_AUTO RADIOBUTTON |
Перемикач, який може знаходитись уу ввімкненому (всередині напівжирна крапка) або вимкненому (всередині немає крапки) стані. Може бути ввімкнений лише один перемикач групи |
BS_DEF PUSHBUTTON |
Те ж, що й BS_PUSHBUTTON, але кнопка має товсту чорну рамку. Якщо така кнопка знаходиться в діалоговому вікні, то вона надсилає повідолмення батьківському вікну при натисненні клавіші Enter, навіть якщо вона не має фокусу введення. Цей стиль визначає кнопку за замовчуванням |
1 |
2 |
BS_AUTO CHECKBOX |
Прапорець, який може знаходитись лие у ввімкненому або вимкненому стані |
BS_CHECKBOX |
Прапорець стилю BS_AUTOCHECKBOX з текстом праворуч |
BS_GROUPBOX |
Прямокутник, в яком групують органи управління. Він не приймає повідомлення. Текст цього органу відображається в верхньому лівому куті прямокутника |
BS_LEFTTEXT, BS_RIGHTBUTTON |
Цей стиль доповнює стиль прапорця або перемикача і текст розміщує ліворуч від елементу |
BS_PUSH BUTTON |
Стандартна кнопка |
BS_RADIO BUTTON |
Перемикач, який може знаходитись у ввімкненому або вимкненому стані. Текст розташовано праворуч |
BS_ICON |
Органом управління є іконка |
BS_MULTILINE |
Розподіляє текст в деяких рядках всередині кнопки |
BS_NOTIFY |
Орган управління надсилає батьківському вікну повідолмення BN_DBLCLK, BN_KILLFOCUS, BN_SETFOCUS |
BS_PUSHLIKE |
Прапорець або перемикач поводить себе подібно кнопці – припіднімається або притоплюється |
BS_TEXT |
Орган управління є текстом |
BS_RIGHT, BS_LEFT, BS_TOP, BS_BOTTOM |
Текст вирівнено відповідно по правому, лівому, верхньому або нижньому краю в прямокутнику кнопки |
BS_CENTER |
Центрує текст по горизонталі в прямокутнику кнопки |
BS_VCENTER |
Центрує текст по вертикалі в прямокутнику кнопки |
Алгоритм створення кнопки:
описують ідентифікатор кнопки, наприклад:
#define ID_BUTTON 3000
За допомогою цього ідентифікатора розпізнають кнопку. В описі ідентифікатора зщадають довільне цілочисельне значення.
описують дескриптор дочірнього вікна для кнопки. Наприклад, в тілі функції батьківського вікна це можна зробити наступним чином:
static HWND hButton;
викликають функцію CreateWindow.
Наступний лістинг демонструє створення звичайної кнопки з чорною рамкою шириною 200 і виостою 20 пікселів з текстом “Приклад кнопки” в лівому верхньому куті робочої області вікна.
#include "Functions.h"
#define ID_BUTTON 3330
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
char szClassName[]="Example";
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, PSTR, INT nCmdShow)
{ MSG msg; HWND hwnd; hInstacne=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 msg.wParam; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ static HWND hButton;
switch (msg)
{ case WM_CREATE:
{hButton=CreateWindow("BUTTON", "Приклад кнопки",
WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
0, 0, 200, 20, hwnd, (HMENU) ID_BUTTON, hInstance, NULL);
if (!hButton) return 1;
SetFocus(hButton); return 0; }
case WM_DESTROY: {PostQuitMessage(0); return 0; }
} return DefWindowProc(hwnd, msg, wParam. LParam); }
Функція батьківського вікна буде одеружвати від кнопки повідомлення з кодом WM_COMMAND. Так кнопка інформує батьківське вікно про те, що з нею щось зробили. Функція вікна-батька WndProc в цьому прикладі не обробляє повідомлення WM_COMMAND.
Кнопки і повідомлення. До обговорення повідомлень, одержуваних функцією вікна, пригадаємо заголовок цієї функції:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM waram, LPARAM lParam)
Нехай функція батьківського вікна від кнопки одержала повідомлення WM_COMMAND.
Тоді молодше слово wParam(LOWORD(wParam)) дорівнює ідентифікатору кнопки. В прикладі LOWORD(wParam)=ID_BUTTON.
Старше слово цього параметру дорівнює коду сповіщення. За ним судять про здійснену над кнопкою дію. Наприклад, при натисканні на кнопку HIWORD(wParam)=BN_CLICKED.
Параметр lParam містить десриптор вікна кнопки. В попередньому прикладіlParam=(HWND)hButton.
Кнопка стилю BS_GROUPBOXне обробляє повідомлення від миші або клавіатури і не надсилає повідомлення батьківському вікну. Її використовують в якості рамки із заголовком, що об’єднує, всередині якої розташовують інші органи управління.
Користувач управляє станом кнопок за допомогою миші та клавіатури. Додатки для зміни координат кнопок виликають звичайні функції переміщення та зміни розташування вікон. А для управління станом кнопок передають повідомлення.
Існує 2 способи передачі повідомлень вікнам:
1. запис повідомлення в чергу додатку. З цією метою викликають функцію PostMessage:
BOOL PostMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
Вона розташовує повідолмення в чергу повідомлень вікна hwnd і повертає управління. У випадку успішного запису повідомлення значення, що повертається, дорівнює TRUE. Записане повідомлення буде обране в цилі обробки повідомлень. ПараметрuMsgмістить код, аwParamтаlParamмістять параметри повідомлення, що передається.
2. безпосередня передача повідомлення функції вікна. Для цього викликають функцію SendMessage:
LRESULT SendMessage (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
Її параметри ідентичні параметрам функції PostMessage. Але на відміну від неї функція SendMessage викликає функцію вікна і повертає управління лише після обробки повідомлення функцією вікна. Значення, що повертається, залежить від обробника повідомлення в фунгкції вікна.
Кнопки в загальному випадку знаходяться в одному з трьох станів – натиснутому, відтиснутому та невизначеному. Для одерждання стану кнопки передають повідомлення BM_GETSTATE:
WORD nSt=(WORD)SendMessage(hButton,BM_GETSTATE,0,0L);
Перемикачам і прапорцям для зміни стану надсилають повідомлення BM_SETCHECK. Параметр wParam повідомлення BM_SETCHECK задає новий стан. Для примусового встановлення їх стану є додаткова причина. Перемикачі та прапорці стилів BS_3STATE, BS_CHECKBOX, BS_RADIOBUTTON не перемальовуються при їх перемиканні. Для їх перемалювання надсилають повідомлення BM_SETCHECK.
Наприклад, наступний оператор переводить перемикач або прапорець з дескриптором hButton у ввімкнений стан:
SendMessage(hButton, BM_SETSTATE, BST_CHECKED, 0L);
Прапорці і перемикачі.Важливим різновидом кнопок є прапорці і перемикачі. Їх використовують для вибору режиму роботи додатку.
В додатках перемикачі стилів BS_RADIOBUTTON та BS_AUTORADIOBUTTON використовують аналогічно кнопкам перемикання діапазонів в радіоприймачі. В одній групі розташовують декілька таких “радіоперемикачів”, причому включеним може бути лише один з них. Такі перемикачі називають перемикачами із залежною фіксацією. Включення одного перемикача в групі викликає вимкнення останніх.
Прапорці BS_CHECKBOX,BS_AUTOCHECKBOX,BS_3STATE,BS_AUTO3STATEвикористовують як окремі незалежні прапорці. В групі прапорців можуть бути ввімкнені одночасно декілька прапорців.
З перемикачем стилю BS_AUTORADIOBUTTONі прапорцем стилюBS_AUTOCHECKBOXпрацюють так, як і з кнопками стилюBS_PUSHBUTTONабоBS_DEFPUSHBUTTON. При натисканні лівої кнопки миші такий перемикач або прапорець автоматично змінює свій стан. При цьому неперекреслений квадратик стає перекресленим і навпаки. Стан перемикача відзначається жирною крапкою. При зміні стану прапорця або перемикача батьківське вікно одержує повідомленняWM_COMMANDз кодом сповіщенняBN_CLICKED.
Прапорець стилю BS_3STATEабоBS_AUTO3STATEзовні схожий на прапорецьBS_CHECKBOX, але додатково має третій стан. В третьому стані він зображується сірим кольором, наприклад для індикації недоступного для втсановлення параметру.