Організація інтерфейсу користувача

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Кафедра: Автоматика та Інформаційні Технології

ОРГАНІЗАЦІЯ ІНТЕРФЕЙСУ КОРИСТУВАЧА

Зміст

1. Визначення користувальницького інтерфейсу

2. Класифікація інтерфейсів

3. Текстовий режим роботи відеоадаптера

4. Функції текстового режиму

4.1 Загальні параметри

4.2 Управління курсором

4.3 Управління атрибутами тексту

4.4 Очищення тексту

4.5 Копіювання тексту

5. Реалізація користувальницького інтерфейсу в BORLAND C + +

5.1 Загальні принципи

5.2 Консольний інтерфейс

5.3 Просте меню

5.4 Меню з переміщенням курсору

5.5 Введення рядка з редагуванням

6. Практичні завдання

6.1 Контрастність атрибутів

6.2 Розробка інтерфейсу

7. Лабораторні завдання

7.1 Рішення квадратного рівняння

7.2 Побудова графіка довільної функції

8. Додаткові завдання

8.1 Елемент керування «Список»

8.2 Введення рядка з редагуванням і прокруткою

Бібліографічний список

  1. Визначення користувальницького інтерфейсу

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

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

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

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

  • вхідні повідомлення, які генеруються людиною за допомогою засобів вводу (клавіатури, миші і т.п.);

  • вихідні повідомлення, які генеруються комп'ютером у вигляді текстів, звукових сигналів і / або зображень і виводяться користувачеві на екран монітора або інші пристрої виведення інформації.

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

2. Класифікація інтерфейсів

За аналогією з процедурних і об'єктним підходом до програмування розрізняють процедурно-орієнтований та об'єктно-орієнтований підходи до розробки інтерфейсів (див. рис. 7).

Рис.7. Типи користувальницьких інтерфейсів

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

Об'єктно-орієнтовані інтерфейси використовують дещо іншу модель взаємодії з користувачем, орієнтовану на маніпулювання об'єктами предметної області. Ми не будемо детально зупинятися на об'єктно-орієнтованих користувальницьких інтерфейсів, оскільки для вирішення навчальних завдань досить процедурного підходу, значно більш простого в реалізації. Як приклад об'єктно-орієнтованого інтерфейсу можна привести програму «Провідник» ОС Windows. Об'єктами предметної області у цьому випадку є файли і папки. Виконання операції може виглядати так: користувач «бере» файл (точніше, об'єкт інтерфейсу, відповідний файлу) і «перетягує» його в іншу папку, ініціюючи таким чином переміщення «фізичного» файлу на диску.

Процедурно-орієнтовані інтерфейси, у свою чергу, можна розділити на кілька підтипів: консольні, меню і з вільною навігацією.

Консольним називають інтерфейс, який організовує взаємодію з користувачем на основі послідовного введення і виведення інформації у текстовому режимі за принципом «питання-відповідь». Зазвичай такий інтерфейс реалізує конкретний сценарій роботи, наприклад: введення даних - вирішення задачі - висновок результату (мал., а). Єдине відхилення від послідовного процесу, що забезпечується даним інтерфейсом, полягає в організації циклу для обробки декількох наборів даних (мал., би). Подібні інтерфейси в даний час використовують тільки в процесі навчання програмуванню або в тих випадках, коли вся програма реалізує одну функцію, наприклад, в деяких системних утилітах.


а) б)

Рис. 7. Структура програми з консольним інтерфейсом

Як приклад програми з консольним інтерфейсом розглянемо програму вирішення квадратного рівняння (див. рис. 7).

Рис. 7. Зовнішній вигляд консольного інтерфейсу

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

Інтерфейс-меню, на відміну від консольного інтерфейсу, дозволяє користувачеві вибирати необхідні операції зі спеціального списку, що виводиться йому програмою. У цьому типі інтерфейсів послідовність дій вибирається самим користувачем. Розрізняють однорівневі і ієрархічні меню. Перші використовують для порівняно простих випадків, коли варіантів небагато (не більше 5-7), і вони включають операції одного типу, наприклад, Створити, Відкрити, Закрити і т.п. Другі застосовуються при великій кількості варіантів або їх очевидних відмінностей, наприклад, операції з файлами та операції з даними, що зберігаються в цих файлах. На рис. 7 показано типова структура алгоритму програми, організуючою однорівневе меню.

Алгоритм програми з багаторівневим меню звичайно будується за рівнями, причому вибір команди на кожному рівні здійснюється так само, як для однорівневого меню.

Інтерфейс-меню припускає, що програма в будь-який момент часу знаходиться або в стані обслуговування меню (очікування вибору з боку користувача), або в стані виконання операції. Користувач, як правило, змушений чекати, поки виконується вибране ним дію.

Рис. 7. Структура програми з інтерфейсом-меню

Меню може бути побудовано різними способами. Найпростіший варіант реалізації меню - виведення списку пунктів і пропозиція ввести номер пункти з цього списку (див. рис. 7,   а). Більш складний варіант - список, за яким можна переміщатися за допомогою клавіш (зазвичай клавіші управління курсором). Переваги цього способу в тому, що він зручніше, привабливіше виглядає, не вимагає від користувача співвіднесення тексту меню з номером пункту і зменшує ймовірність помилки при виборі за рахунок того, що поточний пункт меню «підсвічується». Зовнішній вигляд такого меню наведений на рис. 7,   б.


а) б)

Рис. 7. Зовнішній вигляд інтерфейсу-меню

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

Зовнішній вигляд деяких поширених інтерфейсних елементів у системі ОС Windows наведено на рис. 7. Перерахуємо ці компоненти (у дужках дані усталені англійські назви):

  • опція, прапорець (checkbox), рис. 7, а;

  • поле введення (edit box), рис. 7, б;

  • набірний лічильник (spin control, up / down control), рис. 7, в;

  • кнопка (button), рис. 7, г;

  • індикатор ходу виконання завдання (progress bar), рис. 7, д;

  • повзунок (slider), рис. 7, е;

  • списки: лінійний (list box, рис. 7, ж), що випадає (combo box, рис. 7, з), деревоподібний (tree control, рис. 7, і);

  • перемикач (radio button), рис. 7, к;

  • меню (menu), рис. 7, л;

  • панель інструментів (toolbar), рис. 7, м.

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


а)


б)


в)


г)


д)


е)


ж)


з)


і)


к)


л)


м)

Рис. 7. Компоненти інтерфейсу з вільною навігацією

Як правило, інтерфейси цього типу реалізують, використовуючи подієве програмування і об'єктно-орієнтовані бібліотеки, що передбачає застосування візуальних середовищ розробки програмного забезпечення. Тим не менш, нескладні інтерфейси з вільною навігацією можна реалізувати і на процедурно-орієнтованої мови (наприклад, Сі) у однозадачной операційній системі без подієвого управління (наприклад, MS - DOS). Приклад такого інтерфейсу для програми вирішення квадратного рівняння наведено на рис. 7.

Рис. 7. Зовнішній вигляд інтерфейсу з вільною навігацією

Інтерфейс даної програми складається з трьох полів вводу для коефіцієнтів a, b, c і кнопки «Вихід». Користувач може ввести значення в поля в довільному порядку. Після введення значення програма автоматично перераховує коріння квадратного рівняння і оновлює інформацію на екрані. Поточний елемент керування (поле введення або кнопка) підсвічується, як це прийнято у всіх системах, що допускають навігацію з використанням клавіатури.

3. Текстовий режим роботи відеоадаптера

З попередніх лекцій Вам вже відомо, що сучасні відеоадаптери можуть працювати в різних відеорежимах, які можна підрозділити на текстові та графічні. Частина функцій текстового виводу також вже розглянута. В основному ці функції розраховано на потоковий висновок інформації і можуть бути використані як для виводу на екран, так і для виведення у файл. У даній лекції наводиться опис функцій, які дозволяють працювати з текстовою інформацією на екрані більш складним чином. Ці функції не можуть застосовуватися для висновку в файл, так як вони використовують особливості відеопам'яті, що надає довільний доступ до вмісту (на відміну від потокових механізмів роботи з файлами).

Розглянемо докладніше роботу відеоадаптера в текстовому режимі. Екран у текстовому режимі розбивається на стовпці і рядки символів. Кількість стовпців і рядків залежить від встановленого відеорежиму. Розміри екрану для стандартних відеорежимів наведено в табл. 2. За замовчуванням програми під MS - DOS працюють у кольоровому відеорежимі 80 × 25 (C 80), проте при запуску їх під Windows NT / 2000 / XP система пропонує за замовчуванням відеорежим 80 × 50 (C 4350). Для забезпечення коректної роботи програм потрібно або встановлювати режим самостійно (функцією textmode), або визначати розміри екрану (функцією gettextinfo) і здійснювати вивід з урахуванням отриманих значень.

Крім перерахованих, у сучасних відеоадаптерах існують режими з шириною екрану, що дорівнює 132 символу. У цих режимах на екран поміщається значно більше інформації. У той же час якість виведення тексту практично не погіршується, так як сучасні монітори підтримують значно більші дозволу і мають великі розміри екрану, ніж на зорі розвитку ЕОМ. Однак ці режими не підтримуються Borland C + +, тому що вони з'явилися дещо пізніше відповідних бібліотек мови Сі.

Таблиця 2

Характеристики текстових відеорежимів

Розміри екрану

Кількість кольорів

Константа Сі

40 × 25

16 відтінків сірого

BW40

40 × 25

16 кольорів

C40

8 0 × 25

16 відтінків сірого

BW 8 0

8 0 × 25

16 кольорів

C80

8 0 × 25

2 (монохромний)

MONO

8 0 × 43 (EGA)

8 0 × 50 (VGA)

16 кольорів

C4350

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

На кожне знакомісце у відеопам'яті відводиться два байти. В один з них записується ASCII-код символу, який буде подаватись у відповідному місці екрана. Інший байт називається байтом атрибутів тексту і містить інформацію про колір символу. Молодші 4 біти атрибутів визначають колір тексту, старші - колір фону. Коди квітів наведено в табл. 2. Знакоместа записуються у відеопам'яті послідовно зліва направо, зверху вниз.

Таблиця 2

Коди квітів текстового режиму

Код

Колір

Константа Сі

Код

Колір

Константа Сі

0

Чорний

BLACK

8

Чорний

DARKGRAY

1

Темно-синій

BLUE

9

Світло-синій

LIGHTBLUE

2

Темно-зелений

GREEN

10

Світло-зелений

LIGHTGREEN

3

Темно-блакитний

CYAN

11

Світло-блакитний

LIGHTCYAN

4

Темно-червоний

RED

12

Світло-червоний

LIGHTRED

5

Темно-рожевий

MAGENTA

13

Світло-рожевий

LIGHTMAGENTA

6

Коричневий

BROWN

14

Жовтий

YELLOW

7

Світло-сірий

LIGHTGRAY

15

Білий

WHITE

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

За формування зображення на екрані з ASCII-кодів і атрибутів тексту відповідає відеоадаптер. Програмісту не доводиться витрачати для цього практично жодних зусиль. Перетворення ASCII-коду в растровий образ символу, що виводиться на екран, здійснюється «на льоту» в процесі розгортки кадру. При цьому використовується шрифт, який або «прошитий» в ПЗУ відеоадаптера, або заздалегідь завантажений з ОЗУ користувачем. Шрифти, використовувані за умовчанням в системі MS - DOS, містять у другій половині таблиці європейські символи. У зв'язку з цим для виведення кирилиці в текстовому режимі потрібно налаштування системи на 866 кодову сторінку або установка русифікатора перед запуском програми. І в тому, і в іншому випадку з диска підвантажується русифікований шрифт і встановлюється в якості поточного шрифту для відеоадаптера.

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

Система координат на екрані виглядає так само, як і в графічному режимі: вісь X спрямована вправо, вісь Y - вниз. Лівий верхній кут має координати (1; 1), на відміну від графічного режиму (де він має нульові координати). У багатьох випадках текстові функції Сі працюють не безпосередньо з екраном, а з деякою його прямокутною областю, званої вікном висновку. За замовчуванням вікно займає весь екран, але його координати можуть бути змінені програмістом. При виведенні в вікно вміст екрана за межами вікна не змінюється, а перенесення занадто довгих рядків виробляється по межі вікна, а не екрану.

4. Функції текстового режиму

Для використання описаних нижче функцій необхідно підключити заголовний файл <conio.h>.

4.1 Загальні параметри

void textmode (int newmode)

Встановлює заданий текстовий відеорежим (див. табл. 2).

void window (int left, int top, int right, int bottom)

Встановлює нове текстове вікно. Завдання некоректних координат призводить до ігнорування звернення до функції window. Параметри left і top задають координати екрану для верхнього лівого кута вікна, bottom і right визначають координати екрану для нижнього правого кута вікна.

За замовчуванням вікно займає весь екран. Наприклад, в режимі 80 × 25 за замовчуванням координати вікна рівні 1,1,80,25.

void gettextinfo (struct text_info * pinfo)

Заповнює структуру text _ info, на яку вказує pinfo, відео про поточному режимі. За допомогою цієї функції, зокрема, можна дізнатися про поточні координати вікна, встановлений відеорежим, розміри екрана.

4.2 Управління курсором

void gotoxy (int x, int y)

Переміщує курсор в задану позицію текстового вікна. Лівий верхній кут вікна має координати (1,1). Якщо координати з якоїсь причини вказані неправильно, то виклик даної функції ігнорується. Прикладом такої помилки може служити виклик gotoxy (40,30), коли розмір вікна   дорівнює 35 × 25.

int wherex (); int wherey ()

Повертають координати поточної позиції курсору (щодо текстового вікна).

void _ setcursortype (int cur_t)

Визначає зовнішній вигляд текстового курсору. За допомогою цієї функції можна відключити курсор (параметр _ NOCURSOR), включити суцільний «блоковий» курсор (_ SOLIDCURSOR) або повернути стандартний вигляд курсору (_ NORMALCURSOR). Відключення курсору дуже часто використовується в інтерфейсах-меню та інтерфейси з вільною навігацією.

4.3 Управління атрибутами тексту

void highvideo (); void lowvideo ()

Встановлюють підвищену і знижену (відповідно) яскравість виведення символів. Ці функції не впливають на всі символи, що відображаються в даний момент часу на екрані. Їх виклик впливає тільки на наступний висновок на консоль в текстовому режимі.

void normvideo ()

Встановлює нормальну яскравість для символів шляхом повернення до тих значень текстових атрибутів (символів і фону), які були в момент запуску програми.

void textcolor (int newcolor)

Встановлює колір символів для виведеного на екран тексту. Як аргумент можна передавати константи кольору, наведені в табл. 2.

void textbackground (int newcolor)

Встановлює колір фону для виведеного на екран тексту. Як аргумент можна передавати константи кольору зі значеннями 0 ÷ 7, наведені в табл. 2.

void textattr (int newattr)

Встановлює атрибути виведеного тексту. Ця функція дає можливість встановити колір фону і тексту за виклик. Для того щоб сформувати байт атрибутів, необхідно колір фону зрушити на 4 розряди вліво і скласти з кольором тексту: attr = back <<4 + text.

4.4 Очищення тексту

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

void clrscr ()

Очищає поточне текстове вікно і встановлює курсор у лівий верхній кут (у позицію 1,1).

void clreol ()

Стирає всі символи від позиції курсора до кінця рядка без переміщення курсору.

void delline (); void insline ()

Функція delline видаляє поточний рядок (в якій знаходиться курсор) і піднімає всі рядки, які знаходяться нижче курсору, на один рядок вгору. Функція insline вставляє порожню рядок у позицію курсору текстового вікна, використовуючи при цьому поточний колір тла. Всі рядки, які лежать нижче даної, зсуваються на один рядок вниз, а останній рядок у текстовому вікні пропадає.

4.5 Копіювання тексту

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

int movetext (int left, int top, int right, int bottom, int destleft, int desttop)

Копіює вміст прямокутної області на екрані, яка визначається значеннями left (ліва межа), top (верхня межа), right (права межа) і bottom (нижня межа), в нову прямокутну область, яка визначається аналогічним чином. Лівий верхній кут нового прямокутника задається парою параметрів destleft і desttop. Копіювання для перекриваються вікон виконується коректно.

int gettext (int left, int top, int right, int bottom, void * destin)

Заносить вміст прямокутної області на екрані, заданої значеннями параметрів left, top, right, bottom в область пам'яті, на яку вказує destin.

Функція зчитує вміст прямокутника в пам'ять послідовно, зліва направо і зверху вниз. Кожна позиція екрана займає 2 байти пам'яті. Перший байт відповідає символу даного знакоместа, а другий - його атрибутам.

Потрібне місце для прямокутника в w стовпців шириною і h рядків висотою визначається наступним чином:

розмір в байтах = (h рядків) × (w стовпців) × 2.

int puttext (int left, int top, int right, int bottom, void * source)

Виводить вміст області пам'яті, на яку вказує source, в прямокутник на екрані, координати якого задаються значеннями left, top, right і bottom. Функція виводить вміст області пам'яті в заданий прямокутник в послідовності зліва направо і зверху вниз.

5. Реалізація користувальницького інтерфейсу в Borland C + +

5.1 Загальні принципи

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

Обчислювальна частина програми не повинна самостійно виводити на екран будь-які повідомлення (виняток становлять повідомлення, що виводяться в налагоджувальних цілях, але їх у фінальній версії програми також бути не повинно). Крім того, вона не повинна завершувати роботу програми (за винятком ситуацій, коли нормальне продовження роботи в принципі неможливо, наприклад, при сильних пошкодженнях службових структур в пам'яті).

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

Основна вимога до інтерфейсної частини - забезпечувати максимальний захист від помилок введення. Контроль складних залежностей між вводяться даними, які визначаються типом виконуваного завдання, зазвичай виконується ядром. У той же час інтерфейс в змозі відстежити прості помилки: введення рядка замість числа, введення числа за межами заданого діапазону і т.п. Перевірки «на дурість» повинні піддаватися всі дані, що вводяться користувачем.

5.2 Консольний інтерфейс

Консольний інтерфейс досить просто реалізується за допомогою стандартних функцій вводу-виводу: printf, scanf, puts, getch. Перед висновком можна очистити екран, щоб попередні сеанси роботи з програмою не відволікали користувача. Для деяких видів програм, особливо для системних утиліт, очищення екрана є небажаною, тому що інформація про попередні запуски може знадобитися користувачеві. Втім, до навчальних програм це відношення не має, і екран краще все-таки очистити.

Перед кожним запитом даних необхідно вивести користувачеві запрошення для введення цих даних, наприклад: «Введіть коефіцієнт a». Якщо введення проводиться за порівняно складним правилам, їх необхідно також коротко описати перед введенням (наприклад, при введенні масиву потрібно спочатку запитати число елементів N, а потім вказати, що елементи вводяться N разів).

Оскільки після завершення програми на екрані з'являється оболонка Borland C + + і закриває результати розрахунків, бажано призупиняти виконання програми до натискання клавіші після виведення результатів. При цьому користувачеві потрібно вивести відповідне повідомлення.

Крім того, введення даних можна здійснювати не стандартними функціями, а розглянутими нижче функціями введення з редагуванням. Це дозволить зробити інтерфейс більш дружнім користувачеві, особливо у випадку, коли розрахунки можна повторити (у другій та наступних ітераціях можна пропонувати користувачеві за замовчуванням попередні значення параметрів).

Відповідно до принципів поділу інтерфейсу і обчислювального ядра введення, висновок і обчислення слід розміщувати в різних функціях. Загальну логіку роботи «введення - обчислення - висновок» можна також винести в окрему функцію:

void run ()

{

input_data ();

calculate ();

show_results ();

}

Зрозуміло, прототипи функцій введення input_data (), обчислень calculate () і виведення show_results () можуть бути (і будуть) іншими, залежними від конкретної програми і способів передачі даних в ядро. Такий підхід дозволяє легко організувати циклічне виконання розрахунків. Для цього функцію run () потрібно викликати в do ... while-циклі, вихід з якого здійснюється при негативній відповіді на запитання «продовжити?».

В іншому програмування консольного інтерфейсу, як правило, не викликає труднощів.

5.3 Просте меню

Просте меню відрізняється від консольного інтерфейсу в першу чергу послідовністю виконання операцій. Програма обов'язково зациклюється, умова виходу з циклу - вибір пункту меню «Вихід». Всередині циклу розміщується запит номера меню та його обробка. Запит може здійснюватися функціями scanf, getch і т.п. Обробка звичайно реалізується оператором switch, в якому для кожного пункту меню передбачена окрема гілка case, а всі інші значення «тихо» ігноруються. Повідомляти користувача про вибір неправильного пункту меню необов'язково, це може його дратувати (наприклад, при випадковому промаху в процесі натискання клавіші).

Основна інтерфейсна функція може виглядати так:

void run ()

{

//... виведення меню на екран

int cont_menu_loop = 1;

do

{

int sel_menu;

//... введення sel_menu будь-яким зручним способом

switch (sel_menu)

{

case 0: / / введення значення a

a = input_ float ();

break;

case 1: / / введення значення b

b = input_ float ();

break;

//...

case 4: / / обчислення і виведення результатів

calculate ();

show_results ();

break;

case 5: / / вихід

cont_menu_loop = 0;

break;

}

} While (cont_menu_loop);

}

Якщо меню використовується як частина більш складного користувальницького інтерфейсу, то висновок меню і вибір пункту можна винести в окрему функцію. Цій функції можна передавати масив рядків з назвами окремих пунктів, а повертається значення (номер обраного пункту) аналізувати в операторі switch. Такий підхід у подальшому дозволяє легко перейти від меню одного типу до меню іншого типу, наприклад, від простого (див. рис. 7,   а) до меню з переміщенням курсору (див. рис. 7,   б).

5.4 Меню з переміщенням курсору

Основна відмінність цього варіанту меню від простого полягає в способі введення змінної sel _ menu. Якщо в простому меню вона вводиться безпосередньо користувачем, то в даному варіанті введення здійснюється опосередковано за допомогою клавіш управління курсором. Вибір пункту можна організувати таким чином:

void highlight_menu (int item, int highlight);

void run ()

{

//...

int selected = 0;

int sel_menu = 0;

do

{

highlight_menu (sel_menu, 1); / / підсвічує пункт меню

int key = getch ();

highlight_menu (sel_menu, 0); / / тимчасово гасимо пункт меню

switch (key)

{

case 0:

key = getch ();

switch (key)

{

case UP:

sel_menu = (sel_menu-1 + max_menu)% max_menu;

break;

case DOWN:

sel_menu = (sel_menu + 1)% max_menu;

break;

}

break;

case ENTER:

selected = 1;

break;

}

} While (! Selected);

//...

}

У наведеному фрагменті коду функція highlight_menu виводить елемент меню з заданим номером з включену (highlight! = 0) або виключеною (highlight = = 0) підсвічуванням. Цю функцію можна реалізувати різними способами. Як правило, підсвічування проводиться за допомогою установки відповідних атрибутів тексту або викликом функцій highvideo і lowvideo. У залежності від реалізації в highlight_menu може знадобитися передача додаткових параметрів, що описують меню (наприклад, масив рядків з назвами пунктів, розміри меню на екрані і т.п.).

5.5 Введення рядка з редагуванням

Стандартні засоби Сі для введення даних (функція scanf) надають користувачеві дуже мало можливостей. Редагування тексту, що вводиться можливо тільки шляхом видалення символів з кінця рядка, початкове значення встановити не можна (за замовчуванням вводиться порожній рядок), прокручування рядка, якщо вона не влазить у вікно, не передбачено (точніше, рядок просто переноситься по межі вікна, що не завжди бажано ).

У зв'язку з цим дуже часто виникає необхідність у розробці своїх засобів введення тексту, які забезпечили б зручний і звичний для користувача інтерфейс. При цьому досить організувати введення текстової рядки, а введення чисел і більш складних значень (наприклад, інтервалів) організовується на основі текстового введення з наступною обробкою введеного рядка (наприклад, читанням числа з допомогою функції strtol).

Розглянемо наступну функцію введення тексту з редагуванням:

int inputstr (char * str, int maxlen)

{

int x = wherex (), y = wherey (), curlen = strlen (str);

int pos = curlen;

char firstkey = 1;

highvideo ();

cprintf ("%-* s ", maxlen, str);

lowvideo ();

gotoxy (x + pos, y);

_setcursortype (_NORMALCURSOR);

int exitcode =- 1;

while (exitcode <0)

{

int key = getch ();

switch (key)

{

case 0:

key = getch ();

switch (key)

{

case LEFT:

if (pos> 0)

- Pos;

break;

case RIGHT:

if (pos <curlen)

+ + Pos;

break;

case DELETE:

if (pos <curlen)

movmem (str + pos +1, str + pos, curlen-pos);

break;

case HOME:

pos = 0;

break;

case END:

pos = curlen;

break;

}

break;

case BACKSPACE:

if (pos> 0)

{

- Pos;

movmem (str + pos +1, str + pos, curlen-pos);

}

break;

case ESC:

exitcode = 0;

break;

case ENTER:

exitcode = 1;

break;

default:

if (key> = '')

{

if (firstkey)

{

pos = 0;

str [0] = 0;

}

if (curlen <maxlen)

{

movmem (str + pos, str + pos +1, curlen-pos +1);

str [pos] = key;

+ + Pos;

}

}

}

curlen = strlen (str);

firstkey = 0;

gotoxy (x, y);

cprintf ("%-* s ", maxlen, str);

gotoxy (x + pos, y);

}

_setcursortype (_NOCURSOR);

gotoxy (x, y);

return exitcode;

}

Ця функція організовує введення рядка обмеженої довжини з можливістю переміщення курсору клавішами Left, Right, Home, End і видалення символів клавішами Delete і Backspace. Введення завершується при натисненні Enter або Esc, при цьому значення, що повертається показує, яка з клавіш була натиснута. Це дозволяє в зухвалому функції визначити, відмовився користувач від введення або підтвердив його. Якщо перша натиснута клавіша призводить до введення символу, то старе рядок очищається. Така особливість дозволяє легко вводити нові дані замість старих. У той же час, якщо першою натиснутою клавішею була клавіша редагування, старе вміст зберігається.

Перед початком введення функція встановлює нормальний вигляд курсору, а після закінчення введення приховує текстовий курсор. Це дозволяє використовувати функцію в інтерфейсах-меню та інтерфейси з вільною навігацією, не вдаючись до додаткових викликам _setcursortype.

При редагуванні рядки її вміст в буфері str переміщається функцією movmem, яка призначена для копіювання ділянки пам'яті. Для використання цієї функції необхідно підключити заголовний файл <mem.h>.

Наведена функція inputstr може використовуватися в якості заміни scanf, при цьому інтерфейс стає більш дружнім, що сприятливо позначається на враженні користувача від програми. Для введення чисел різних типів можна написати окремі функції, що перетворюють число в рядок, що викликають inputstr і потім перетворюють отриманий рядок назад в число.

6. Практичні завдання

6.1 Контрастність атрибутів

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

6.2 Розробка інтерфейсу

Розробити опис користувальницького інтерфейсу для програми «Будильник».

Вихідними даними для програми є:

  • час, на який встановлено будильник;

  • прапорець, який показує, включений будильник або вимкнений;

  • період повторення сигналу: однократне спрацьовування, включення кожен день, включення раз на тиждень.

Для програми потрібно розробити консольний інтерфейс, інтерфейс-меню і інтерфейс з вільною навігацією. Результатом розробки є текстовий опис запитів, пунктів меню або компонентів інтерфейсу відповідно.

7. Лабораторні завдання

7.1 Рішення квадратного рівняння

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

Якщо рівняння має один корінь, то потрібно виводити тільки одне значення. Якщо рівняння не має коренів, виводиться відповідне повідомлення.

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

7.2 Побудова графіка довільної функції

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

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

Зауваження: парсинг введеного тексту можна реалізувати рекурсією.

8. Додаткові завдання

8.1 Елемент керування «Список»

Реалізувати програмно елемент керування «Список з прокруткою» для текстового режиму. Робота зі списком повинна зводитися до виклику однієї функції, в яку передаються координати області на екрані, яку займає список, і масив рядків, що становлять список. Функція самостійно організовує інтерфейс для вибору елемента.

Кожен рядок представляє один елемент списку. У рядках не повинно бути символів повернення каретки та переведення рядка. Елементи повинні виводитися в заданому вікні. Кількість рядків у списку може як перевищувати висоту вікна, так і бути менше її. У першому випадку необхідно передбачити прокручування вмісту у вікні, в другому - забезпечити коректний вибір тільки тих позицій у вікні, які містять рядки списку (іншими словами, курсор не повинен виходити за межі і вікна, і списку).

Поточний вибір підсвічується яким-небудь кольором, заданим розробником. Вибір елемента здійснюється натисненням клавіш «Up» (переміщення курсору вгору) і «Down» (переміщення курсору вниз).

Підтвердження вибору (і вихід з функції) здійснюється при натисканні клавіш Enter, Esc, Left, Right, Tab, Shift + Tab. Кожній з цих клавіш повинен відповідати певний код, який також повертається функцією вибору зі списку. Цей код може використовуватися викликає функцією для того, щоб визначити подальшу дію: перехід до попереднього (Shift + Tab, Left) або наступного (Tab, Right) елементу управління, виконання основної дії програми (Enter), вихід з програми (Esc).

Крім зазначеного коду функція повинна повертати індекс вибраного елементу списку.

8.2 Введення рядка з редагуванням і прокруткою

Написати функцію введення текстової рядки з редагуванням. При виконанні функції їй передається довжина поля вводу (максимальна довжина відображуваної на екрані частини рядки), а також координати першого символу поля вводу на екрані. Поле введення однорядкове, тобто має висоту, яка дорівнює 1 знакоместу.

Довжина введеної рядка може перевищувати розміри поля введення. Якщо в процесі введення або переміщення курсору по рядку поточна позиція введення виходить за межі поля, необхідно виробляти прокручування рядки у вікні.

На розсуд розробника максимальна довжина рядка може або передаватися у функцію, або визначатися обсягом доступної динамічної пам'яті. У першому випадку буфер під рядок резервує викликає функція, у другому - функція введення.

Функція введення повинна надавати такі можливості щодо редагування тексту: переміщення курсору, введення символу, видалення символу над курсором (клавіша Delete), видалення символ перед курсором (клавіша Backspace).

Якщо частина рядка знаходиться за межами поля, бажано показувати це яким-небудь чином (наприклад, ставити виділені кольором символи «<» і «>» на початку та в кінці поля введення, якщо є текст за межами поля з відповідної сторони).

Бібліографічний список

  1. Іванова Г.С. Технологія програмування: Підручник для вузів. / Г.С. Іванова. М.: Із МГТУ ім. Н.Е. Баумана, 2002.

  2. Фролов А., Фролов Г. Програмування відеоадаптерів / А. Фролов, Г. Фролов. М.: Діалог-МІФІ, 1993.

  3. Подбельський В.В. Програмування на мові Сі. Учеб. посібник. / В.В. Подбельський, С.С. Фомін, М.: Фінанси і статистика, 2004. - 600 с.

  4. Керніган Б. Мова програмування Сі / Б. Керніган, Д.   Рітчі. М.: Фінанси і статистика, 1992. - 272 с.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Лабораторна робота
130.2кб. | скачати


Схожі роботи:
Тестування для користувача інтерфейсу
Основні принципи розробки графічного інтерфейсу користувача
Організація роботи користувача з АБД
Організація інтерфейсу в мікро ЕОМ
Графічний інтерфейс користувача Linux
Програмування інтерфейсу
Сервісне програмне забезпечення Інтерфейс користувача
Автоматизація роботи користувача в середовищі MS Office
Налагодження програм користувача в Tubro Pascal
© Усі права захищені
написати до нас