- •Хмельницький національний університет проектування інтерфейсів користувача
- •Хмельницький 2009
- •Лабораторна робота №1
- •І. Теоретичні відомості
- •Для розробника вікно є сукупністю великої кількості елементів, які функціонують під управлінням додатку та операційної системи.
- •Створення вікон
- •Головна функція додатку
- •Структура тексту додатку
- •Допоміжні функції створення вікон
- •Приклади створення вікон
- •IV. Контрольні питання
- •Лабораторна робота №2
- •І. Теоретичні відомості
- •Статичний орган управління
- •Смуги прокрутки
- •IV. Контрольні питання
- •Лабораторна робота №3
- •І. Теоретичні відомості
- •Списки рядків
- •Комбінований список
- •IV. Контрольні питання
- •Лабораторна робота №4
- •І. Теоретичні відомості
- •Повідомлення wm_paint
- •Види контексту відображення
- •Встановлення атрибутів контексту відображення
- •Вивід тексту
- •Малювання геометричних фігур
- •IV. Контрольні питання
- •Лабораторна робота №5
- •І. Теоретичні відомості
- •Інструменти малювання
- •Відображення графічних об'єктів
- •IV. Контрольні питання
- •Лабораторна робота №6
- •І. Теоретичні відомості
- •Створення меню
- •Повідомлення від меню
- •Плаваюче меню
- •Акселератори
- •IV. Контрольні питання
- •Література
Комбінований список
Створення комбінованого списку. Цей оран є комбінацією однорядкового редактора тексту і списку і створюється на базі класу COMBOBOX. Комбінований списо створюють так, як і інші орагни управління:
HComboBox=CreateWindow("COMBOBOX", NULL, WS_CHILD|WS_VISIBLE|
WS_VSCROLL|CBS_SIMPLE, 30, 30, 200, 200, hwnd, (HMENU)ID_COMBO, hInst, NULL);
В стилі вікон класу вказують символічні імена з префіксом CBS_ (табл.3.3).
Таблиця 3.3. Список стилів комбінованого списка
Стиль |
Пояснення |
CBS_AUTOHSCROLL |
Автоматично зсувати текст ліворуч при досягненні правого краю вікна редагування |
CBS_DISABLENO SCROLL |
Вертикальну смугу перегляду відображати в неактичному стані, навіть якщо в списку поміщаються всі рядки |
CBS_DROP DOWN |
Подыбний до CBS_SIMPLE, але список залишається в невидимому стані, доки користувач не натисне піктограму, призначену для відображення списка |
CBS_DROP DOWNLIST |
Подібний до CBS_DROPDOWN, але однорядковий текстовий редактор відображає текст виділеного в списку рядка |
CBS_LOWERCASE |
Перетворювати всі символи в рядкові |
CBS_NOINTEGRALHEIGHT |
Висота вікна комбінованого списка задає батьківське вікно, інакше (за замовчуванням) висота кратна висоті рядків |
CBS_ SIMPLE |
Створюється список, який завжди видимий і розташований під вікном однорядковго редактора тексту, що містить виділений в списку рядок |
CBS_SORT |
Автоматично сортує рядки, введені у вікно списку |
CBS_UPPERCASE |
Перетворювати всі символи в прописні |
Коди сповіщення. Комбінований список надсилає функції батьківського вікна сповіщувальне повідомлення WM_COMMAND. При цьому молодше слово параметру wParam мітсить ідентифікатор, а lParam – дескриптор цього спику. Старше слово параметру wParam мітсить код сповіщення.
Повідомлення для комбінованого списку. Для управління комбінованим списком використовують набір повідомлень, аналогічний повідомленням для списку і редактора тексту.
Приклад роботи з комбінованим списком.
Задача. У вікні додатку створити однорядковий редактор, комбінований список та кнопку “Добавити”. При натисненні на кнопку вміст редактора записати в список. При подвійному калцанні по рядку списку повідомити про рядок, який було обрано.
Розв‘язок.
#include "Functions.h"
#define ID_EDIT 1000
#define ID_LISTBOX 1001
#define ID_BUTTON 1002
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
char szClassName[]="ComboList";
char szTitle[]="Приклад";
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, PSTR, INT nCmdShow)
{ MSG msg; HWND hwnd; hInstance=hInst;
if (!RegClass(WndProc, szClassName, COLOR_WINDOW)) return FALSE;
if(!(hwnd=CreateWindow(szClassName, szTitle,
WS_OVERLAPPEDWINDOW|WS_VISIBLE, 100, 50, 364, 260,
0, 0, hInstance, NULL))) return FALSE;
while (GetMessage(&msg, NULL, 0, 0))
{ TranslateMessage(&msg);DispatchMessage(&msg);}
return msg.wParam; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ static HWND hCombBox, hEdit, hButton, hStatic; int uItem; char Buf[80];
switch(msg)
{ case WM_CREATE:
{ hStatic=CreateWindow( "STATIC", "Введіть рядок для введення в список",
WS_CHILD|WS_VISIBLE|SS_CENTER,
30, 10, 300, 20, hwnd, (HMENU)0, hInstance, NULL);
hEdit=CreateWindow("EDIT", NULL,
WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL,
30, 40, 300, 30, hwnd, (HMENU)ID_EDIT, hInstance, NULL);
SendMessage(hEdit, EM_LIMITTEXT, 35, 0L);
hCombBox=CreateWindow("COMBOBOX", NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_SIMPLE|CBS_SORT,,
30, 80, 300, 100, hwnd, (HMENU)ID_COMBBOX, hInstance, NULL);
hButton=CreateWindow("BUTTON", "Додати",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
130, 190, 100, 30, hwnd, (HMENU)ID_BUTTON, hInstance, NULL);
SetFocus(hEdit); return 0; }
case WM_COMMAND:
{ switch (LOWORD (wParam))
{ case ID_COMBBOX:
{switch (HIWORD(wParam))
{case CBN_ERRSPACE:
{MessageBox(hwnd, "Мало пам'яті",
szTitle, MB_OK);
return 0; }
case CBN_DBLCLK:
{uItem=(int)SendMessage(hCombBox,
CB_GETCURSEL, 0, 0L);
If (uItem!=LB_ERR)
{SendMessage(hCombBox,CB_GETLBTEXT,
uItem, (LPARAM)Buf);
MessageBox(hwnd, (LPSTR)Buf, szTitle, MB_OK); }
return 0; }
default: return 0; }
return 0; }
case ID_BUTTON:
{SendMessage(hEdit,EM_GETLINE, 0, (LPARAM)Buf);
SendMessage(hCombBox, CB_ADDSTRING, 0, (LPARAM)Buf);
SetWindowText(hEdit, "\0");
SetFocus(hEdit); return 0; }
default: return 0; } }
case WM_DESTROY: {PostQuitMessage(0); return 0; }
} return DefWindowProc(hwnd, msg, wParam, lParam); }
Текст додатку від попереднього відрізняється виглядом використовуваного списка – замість простого використовується комбінований список. Відміни пов’язані з іменами класу COMBOBOX, кодами сповіщень та повідомленнями.
В процесі роботи зі списком теж з’являється одна важлива відміна. В процесі вибору рядка зі списку простий перегляд списку може зайняти багато часу. Комбінований список дозволяє спростити пошук, якщо ви знаєте хоча б декілька перших літер префікса шуканого рядка. Наберіть початкові букви шуканого рядка у вікна редагування комбінованого списка – і потрібний рядок з’явиться перед вашими очима.
IІ. ЗМІСТ ЗВІТУ
Тема, мета, умова завдання.
Опис команд, за допомогою яких було виконано завдання, і результатів їх виконання.
Висновок.
ІІІ. ЗАВДАННЯ
Написати програму мовою програмування C++ для реалізації завдання згідно варіанту.
При запуску додатка запитати пароль. Робочу область при будь-яких змінах розмірів вікна додатку повністю займає багаторядковий редактор зі смугами перегляду та фокусом введення. За замовчуванням користувач працює в режимі “Гість”, та редактор тексту підтримує не всі стандартні можливості. А зареєстрованому користувачу доступні всі стандартні можливості.
В лівому верхньому куті робочої області вікна додатку створити список. Праворуч від списку створити комбінований список. Списки відображати у вікні додатку після натискання лівої кнопки миші і приховувати після натискання правої (в тому числі при натисканні над будь-яким списком). За замовчуванням фокус введення встановити у вікні вибору.
Створити два списки, між ними розташувати кнопки “Перемістити праворуч” та “Перемітсити ліворуч”. Лівий список повинен бути ппочатково заповнений списком рядків. Якщо обрати рядок і натиснути одну з кнопок, то обраний рядок повинен перемітситись зліва направо або навпаки.
Вікно містить порожній рядок введення з написом “Введіть прізвище, ім’я, по-батькові”, групу перемикачів “Стать” з двох пунктів (“Чоловік” та “Жінка”) і кнопку “Так”. При натисканні на кнопку “Так” непорожній вміст рядка введення записати в заголовок групи. Потім при виборі статі повідомити новий вміст заголовка групи, обрану стать та повернутись до початкового стану.
В центрі екрану відобразити вікно без заголовка з фоном кольору тривимірних елементів. Вікно містить текст про права на програмний продукт та кнопки “Вихід” і “Так”. При натисканні кнопки “Вихід” завершити роботу, а кнопки “Так” – текст у вікні замінити введеним текстом про правила роботи, а кнопки замінити кнопками “Назад” і “Далі”. При натисканні кнопки “Назад” повернутись до почтакового стану.
Комбінований список початково заповнити довільними різними рядками. Поруч розташувати кнопку “Вгору”. Якщо обрати рядок і натиснути кнопку “Вгору”, то цей рядок повинен посунутись вгору на одну позицію в списку. Якщо цей рядок вже перший в списку, то заблокувати кнопку.
В робочій області відображено кнопку з написом “Натисніть праву кнопку миші над робочою областю”. Після натискання правої кнопки миші кнопка приховується і відображається багаторядковий редактор з текстом “Натисніть ліву кнопку миші над робочою областю”. Після натискання лівої кнопки миші повернутись до початкового стану.
Створити два однорядкових редактора, під ними два комбінованих списки і ще нижче кнопку “Запис”. В першому редакторі вводити прізвище, в другому – ім’я. Після натискання кнопки “Запис” непорожній вміст редакторів записати в 2 списки. Причому список прізвищ повинен бути сортований в алфавітному порядку. При виділенні прізвища в одному списку виділити відповідне ім’я в другому списку.
При запуску першого екземпляра додатку у вікні додатку відобразити поле введення пароля, а при запуску наступних екземплярів того ж додатку запитати, чи дійсно потрібно запускати ще один екземпляр. Якщо «Так», запустити ще один екземпляр, але пароль більше не запитувати.
Створити однорядковий редактор, список і кнопки «Добавити» та «Змінити». При натисканні на кнопку «Добавити» вміст редактора (якщо він не порожній) добавати в список, очистити редактор та передати йому фокус введення. При натисканні на кнопку «Змінити» обраний рядок списку (якщо він обраний) записати в редактор, видалити зі списку і передати фокус введення редактору.
Створити однорядковий редактор, список і кнопку «Знайти». Початково заповнити список набором рядків. При натисканні на кнопку «Знайти» вміст редактора (якщо він не порожній) використовувати в якості початкових букв пошуку рядка в списку і обрати знайдений рядок.
В цнтрі екрану відобразити вікно без рамок, в верхній частині якого відобразити текст «Анкетні дані працівника», нижче – поле введення прізвища, ім’я, по-батькові, під яким групи перемикачів про стать та освіту. Вікно також містить кнопки “Запис”, “Очищення” та “Вихід”.
Створити рядок введення з числом 0 і праворуч від нього – маленьку вертикальну смугу прокрутки. Під ними кнопки “Вихід” і “Так”. При натисканні на верхню кнопку смуги число в рядку введення збільшити на 1, а на нижню кнопку – зменшити на 1. При натисканні кнопки “Так” відобразити вміст рядка введення, а кнопки “Вихід” – завершити роботу.
У вікні додатку відобразити однорядковий редактор, під ним список і ще нижче – кнопку з написом “Так”. При натисканні на кнопку записати у вікно редактора текст про натискання кнопки.
В робочій області вікна перерахувати назви вивчених в семестрі дисциплін та помітити назви дисциплін, які є сьогодні. Виділити серед цих дисциплін ті, по яких немає екзамену.
В правому верхньому куті робочої області вікна додатку створити список. Ліворуч від списку створити комбінований список. Списки відображати у вікні додатку після натискання правої кнопки миші і приховувати після натискання лівої (в тому числі при натисканні над будь-яким списком). За замовчуванням фокус введення встановити у вікні вибору.
Вікно містить порожній рядок введення з написом “Введіть прізвище, ім’я, по-батькові”, групу перемикачів “Зріст” з трьох пунктів (“До 150 см”, “150-180 см” “Більше 180 см”) і кнопку “Так”. При натисканні на кнопку “Так” непорожній вміст рядка введення записати в заголовок групи. Потім при виборі зросту повідомити новий вміст заголовка групи, обраний зріст та повернутись до початкового стану.
Вікно містить порожній рядок введення з написом “Введіть прізвище, ім’я, по-батькові”, групу перемикачів “Вік” з 5 пунктів (“До 20 років”, “20-30 років”, “30-40 років”, “40-50 років” та “Старше 50 років”) і кнопку “Так”. При натисканні на кнопку “Так” непорожній вміст рядка введення записати в заголовок групи. Потім при виборі віку повідомити новий вміст заголовка групи, обраний вік та повернутись до початкового стану.
В центрі екрану відобразити вікно без заголовка з фоном кольору тривимірних елементів. Вікно містить текст про правила користування програмою та кнопки “Вихід” і “Так”. При натисканні кнопки “Вихід” завершити роботу, а кнопки “Так” – текст у вікні замінити введеним текстом про автора програми, а кнопки замінити кнопками “Назад” і “Далі”. При натисканні кнопки “Назад” повернутись до початкового стану.
В центрі екрану відобразити вікно без заголовка з фоном кольору тривимірних елементів. Вікно містить текст про автора програмного продукту та кнопки “Вихід” і “Так”. При натисканні кнопки “Вихід” завершити роботу, а кнопки “Так” – текст у вікні замінити введеним текстом про правила роботи, а кнопки замінити кнопками “Назад” і “Далі”. При натисканні кнопки “Назад” повернутись до почтакового стану.
Комбінований список початково заповнити довільними різними рядками. Поруч розташувати кнопку “Вниз”. Якщо обрати рядок і натиснути кнопку “Вниз”, то цей рядок повинен посунутись вниз на одну позицію в списку. Якщо цей рядок вже останній в списку, то заблокувати кнопку.
Створити два однорядкових редактора, під ними два комбінованих списки і ще нижче кнопку “Запис”. В першому редакторі вводити прізвище, в другому – посаду. Після натискання кнопки “Запис” непорожній вміст редакторів записати в 2 списки. Причому список прізвищ повинен бути сортований в алфавітному порядку. При виділенні прізвища в одному списку виділити відповідну посаду в другому списку.
Створити два однорядкових редактора, під ними два комбінованих списки і ще нижче кнопку “Запис”. В першому редакторі вводити прізвище, в другому – розімр заробітної плати. Після натискання кнопки “Запис” непорожній вміст редакторів записати в 2 списки. Причому список прізвищ повинен бути сортований в алфавітному порядку. При виділенні прізвища в одному списку виділити відповідну заробітну плату в другому списку.
Створити однорядковий редактор, список і кнопку «Добавити». При натисканні на кнопку «Добавити» вміст редактора (якщо він не порожній) добавати в список, очистити редактор та передати йому фокус введення.
Створити рядок введення з числом 0 і праворуч від нього – маленьку вертикальну смугу прокрутки. Під ними кнопки “Вихід” і “Так”. При натисканні на верхню кнопку смуги число в рядку введення збільшити на 2, а на нижню кнопку – зменшити на 2. При натисканні кнопки “Так” відобразити вміст рядка введення, а кнопки “Вихід” – завершити роботу.
Створити рядок введення з числом 0 і праворуч від нього – маленьку вертикальну смугу прокрутки. Під ними кнопки “Вихід” і “Так”. При натисканні на верхню кнопку смуги число в рядку введення збільшити на 10, а на нижню кнопку – зменшити на 10. При натисканні кнопки “Так” відобразити вміст рядка введення, а кнопки “Вихід” – завершити роботу.
В робочій області вікна перерахувати назви вивчених в минулому семестрі дисциплін та помітити назви дисциплін, які були 2 семестри. Виділити серед цих дисциплін ті, по яких не було екзамену.
Вікно містить порожній рядок введення з написом “Введіть прізвище, ім’я, по-батькові викладача”, групу перемикачів “Посада” з 4 пунктів (“Асистент”, “Старший викладач” “Доцент”, “Професор”) і кнопку “Так”. При натисканні на кнопку “Так” непорожній вміст рядка введення записати в заголовок групи. Потім при виборі посади повідомити новий вміст заголовка групи, обрану посаду та повернутись до початкового стану.
В центрі екрану відобразити вікно без заголовка з фоном кольору тривимірних елементів. Вікно містить текст про спеціальність, на якій ви навчаєтесь, та кнопки “Вихід” і “Так”. При натисканні кнопки “Вихід” завершити роботу, а кнопки “Так” – текст у вікні замінити введеним текстом про посади, на яких ви зможете працювати, а кнопки замінити кнопками “Назад” і “Далі”. При натисканні кнопки “Назад” повернутись до початкового стану.
Створити два однорядкових редактора, під ними два комбінованих списки і ще нижче кнопку “Запис”. В першому редакторі вводити прізвище жінки, в другому – дівоче прізвище. Після натискання кнопки “Запис” непорожній вміст редакторів записати в 2 списки. Причому список прізвищ повинен бути сортований в алфавітному порядку. При виділенні прізвища в одному списку виділити відповідне дівоче прізвище в другому списку.