1. Общие принципы создания интерфейса


Добавил:DMT
Дата создания:5 апреля 2008, 14:35
Дата обновления:5 апреля 2008, 14:56
Просмотров:11561 последний ---
Комментариев: 0

1. Общие принципы создания интерфейса

Интерфейсом между человеком и ЭВМ называется взаимосвязь пользователя и компьютера, которая состоит в обмене данными.

Поскольку вычислительная система служит человеку, то важное значение имеет удобная организация этого обмена. Такая организация называется дружелюбным интерфейсом и качественно зависит от формы представления входных и выходных данных.

В данной главе будут рассмотрены эргономические характеристики интерфейса, его составные части, виды диалога, процессы ввода-вывода и методы написания подпрограмм нижнего уровня на языке Си.

 

1.1. Эргономические характеристики интерфейса

Под эргономическими характеристиками понимаются следующие факторы:

•  конструктивные особенности оборудования;

•  качество разработки диалога;

•  доступность и надежность системы;

•  чувствительность системы.

Конструктивные особенности оборудования зависят от аппаратуры и физических условий. Пользователь должен иметь удобную клавиатуру, экран и другие устройства ввода-вывода, освещение, рабочее место, положительно влияющие на его производительность.

Качество разработки диалога. Разработчик не может повлиять на физические условия, но он может сделать выходные данные понятными по смыслу, входные данные - удобными для ввода. Эта составляющая называется психологической эргономикой. Её изучение является основой для разработки программного обеспечения диалога.

Доступность и надежность системы. Разработчик должен обеспечить доступ к системе в нужное для пользователя время. Кроме того, система должна работать без сбоев.

Чувствительность системы. Число рабочих станций может быть достаточно большим, но это не должно влиять на время реакции системы. Недопустимо длительное ожидание ответа на запрос в течение 20 с и более. Время ответа на различные запросы должно быть примерно одинаковым.

1.2. Составные части интерфейса

Интерфейс обеспечивает связь между человеком и процессом, выполняющим некоторое задание. С точки зрения программного обеспечения в состав интерфейса входят два компонента: набор процессов ввода-вывода и процесс диалога. Эта обобщенная структура показана на рис. 1.1. Пользователь через интерфейс посылает входные и принимает выходные данные.

Диалогом называется обмен данными между пользователем и интерактивной вычислительной системой.

Задачи процесса диалога:

•  определение задания, которое пользователь возлагает на систему;

•  приём логически связанных входных данных от пользователя и размещение их в переменных соответствующего процесса в нужном формате;

•  вызов процесса выполнения требуемого задания;

•  вывод результатов обработки в подходящем для пользователя формате.

Сообщения. Обмен между пользователем и процессом диалога осуществляется с помощью сообщений:

•  подсказка – приглашение на ввод данных;

•  команда – входное со 39a0 общение для управления ходом диалога;

•&n 3853 bsp; входные данные – входное сообщение для данных, например, имя файла, который нужно вывести;

•  сообщение об ошибке – сигнал диалогового процесса о невозможности дальнейшей работы или обработки сообщения пользователя;

•  выходные данные – результаты обработки данных диалоговым процессом;

•  сообщение о состоянии системы – информация о том, что произошло или происходит в системе;

•  справочная информация – информация, поясняющая, что можно дальше делать пользователю.

1.3. Виды диалога

Диалог можно классифицировать с учетом формата входных сообщений и одного из следующих режимов:

В диалоге, управляемом системой, программа жестко задает, какое действие можно выбрать и какие данные можно вводить. Такой диалог осуществляется с помощью подсказок.

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

Существует ряд подсказок в диалоге. Самый сложный – это меню , состоящее из набора возможных вариантов данных для ввода, из которых можно выбрать то, что требуется. Меню может выводиться как набор строк или графических изображений – пиктограмм и выбираться пользователем с помощью специальных указателей. Подсказками могут быть вопросы , на которые пользователь даёт ответы . Подсказкой может быть готовая экранная форма, состоящая из набора полей, каждое из которых должно быть заполнено. Например, составление анкет, заказ товаров, резервирование мест в гостиницах производится на основе экранных форм.

Структура диалога типа «вопрос - ответ» основана на аналогии с обычным интервью. Диалоговая система выводит вопросы, пользователь вводит ответы. Этот диалог имеет следующие особенности:

•  следующие вопросы могут зависеть от предшествующих ответов;

•  при обнаружении ошибки в ответе выводится сообщение об ошибке и вопрос обычно повторяется;

•  ответы могут иметь различные формы – «да» или «нет», или выбирается вариант из предлагаемых ответов, или ответом является текст, удовлетворяющий определенной грамматике.

Рекомендации по разработке диалога типа «вопрос – ответ»:

•  ответы желательно сделать короткими;

•  вопросы выводятся в левой части экрана и имеют длину не более 40 символов;

•  ответы отличаются от вопросов цветом или другими атрибутами;

•  требуется механизм, позволяющий давать ответы сразу на все вопросы. Этот механизм называется опережающим выводом ;

•  в целях ускорения опроса установить вопросы по умолчанию, если это возможно.

Таким образом, получаем следующие виды диалога, управляемого системой:

• меню;

• вопросы и ответы;

• экранная форма.

К ним надо добавить диалог, управляемый пользователем:

• диалог на базе команд.

 

1.4. Процессы ввода – вывода

Для разработки диалоговой системы необходимы следующие подпрограммы нижнего уровня:

•  функция вывода строки в текущую позицию;

•  функция вывода курсора;

•  функция вывода строки в заданную позицию;

•  функция ввода символов и их скан-кодов;

•  функция ввода строки;

•  функции выбора, позиционирования и указания объектов;

•  функции ввода-вывода графических объектов.

К ним можно добавить функции установки атрибутов вывода и размеров курсора.

Выбираемый объект определяется областью экрана, в пределах которой отображается объект, содержанием и атрибутами, описывающими формат объекта.

При абсолютном выборе объекта указывается его место на экране, при относительном - указывается сам объект. Указанием объекта называется абсолютный или относительный выбор этого объекта.

1.5. Методы разработки подпрограмм нижнего уровня

Существуют три способа доступа к видеоадаптеру:

•  через операционную систему;

•  через подпрограммы обработки прерываний;

•  с помощью непосредственного доступа к видеопамяти.

Доступ через операционную систему DOS осуществляется с помощью функций getch() , getche() , cscanf() , cprintf() , clrscr() , которые подсоединяются с помощью директивы

#include <conio.h>

и работают медленно.

Подпрограммы обработки прерываний используют функцию, имеющую следующий прототип:

int int86(int num, union REGS *inregs, union REGS *outregs);

где num – номер прерывания, inregs – входные значения регистров микропроцессора, outregs – выходные значения этих регистров. Эта функция возвращает значение регистра AX . Здесь объединение REGS получается наложением двух структур и определяется как

union REGS

{

struct WORDREGS x;

struct BYTEREGS h;

}

Совмещаемые структуры определяются следующим образом:

struct WORDREGS

{

unsigned int ax, bx, cx, dx, si, di, cflag, flags;

};

struct BYTEREGS

{

unsigned char al, ah, bl, bh, cl, ch, dl, dh;

};

Элементами этих структур являются регистры микропроцессора. Именем flags обозначается регистр флагов. Если поле cflags после завершения подпрограммы int86() ненулевое, то имела место ошибка.

Пример 1. Напишем подпрограмму, определяющую номер текущего видеорежима, с помощью функции 0 Fh прерывания 10 h . Эта функция возвращает номер текущего видеорежима в регистр al :

#include <dos.h>

int video_mode()

{

int v ;

union REGS in , out ; //входные и выходные значения регистров

in . h . ah =0 x 0 f ; //функция 0 Fh

v=int86(0x10, &in, &out);

return 255& v ; //значение младшего байта

}

Если вызвать данную подпрограмму с помощью

int r=video_mode();

то значение r будет равно номеру текущего видеорежима.

Пример 2. Напишем подпрограмму установки размеров курсора с помощью функции 1 прерывания 10 h . В регистре CH задается начальная строка сканирования, в CL – конечная строка:

void setcursortype(char h, char l)

{

union REGS r;

r . x . ax =0 x 0100; //функция 1

r . x . bx =0; //страница 0

r . h . ch = h ; r . h . cl = l ; //номер линий

int86(0x10, &r, &r);

}

Пример 3. Символ и его атрибут выводятся с помощью функции 9 прерывания 10 h . В регистре AL должен находится ASCII -код символа, в BH – номер страницы, в BL – атрибут, в CX – число повторяющихся символов. Запись на экран производится в текущее положение курсора:

void write_syma(char ch, char attr)

{

union REGS r;

r . h . ah =9; //функция

r . h . al = ch ; //символ

r . h . bl = attr ; //атрибут

r . h . bh =0; //страница

r . x . cx =1; //один символ

int86(0x10, &r, &r);

}

Пример 4. Регистр палитры можно изменить с помощью функции 10 h прерывания 10 h . Если в AL записать 0, то изменяется один регистр палитры:

void setpalette ( char i , //номер регистра палитры

char red , //число красных (0-3)

char green , //число зеленых (0-3)

char blue ) //число синих (0-3)

{

union REGS r;

r.h.ah=0x10;

r.h.al=0;

r.h.bl=i;

r.h.bh= (red%2)*32+(red/2)*4+

(green%2)*16+(green/2)*2+

(blue%2)*8+(blue/2);

int86(0x10, &r, &r);

}

Напишем подпрограмму для изменения цветов регистров палитры 0-15. Цвета будут задаваться случайным образом.

#include <stdlib.h>

#include <time.h>

void setpalette(char i, char red, char green, char blue);

//пользуемся написанной подпрограммой

void randpalette ()

{

int i ;

randomaze (); //генерация случайного числа

for(i=0; i<16; i++)

setpalette(i, random(4), random(4), random(4));

}

Пример 5. Установка текущей позиции курсора осуществляется с помощью функции 2 прерывания 10 h :

void goto_xy(int x, int y)

{

union REGS r;

r . x . ax =0 x 0200; //функция установки

r . h . bh =0; //страница

r . h . dh = y ; //номер строки

r . h . dl = x ; //номер столбца

int86(0x10, &r, &r);

}

Непосредственный доступ к видеопамяти осуществляется одним из следующих двух способов:

•  объявляется указатель на видеопамять

char far *vid_mem = (char far *) 0xb8000000;

и для вывода символа ch с атрибутами attr в позицию ( x , y ) на экране производится запись

*vid_mem + 160*x + 2*y = ch;

*vid_mem + 160*x + 2*y + 1 = attr;

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

void pokeb(unsigned seg, unsigned off, char value);

например,

pokeb (0 xB 800, 160* x + 2* y , ch );

pokeb(0xB800, 160*x + 2*y + 1, attr);

Символы и атрибуты можно читать из видеопамяти с помощью операций

ch = *vid_mem + 160*x + 2*y; // символ

attr = *vid_mem + 160*x + 2*y +1; // атрибут

или с помощью функций:

ch = peekb(0xB800, 160*x + 2*y);

attr = peekb(0xB800, 160*x + 2*y + 1);

Видеопамять можно рассматривать как массив, состоящий из байтов. Каждой позиции экрана ( x , y ) соответствует два байта – код символа и атрибут. Код символа находится по адресу 0 xB 8000000+160* y +2* x , байт атрибута – по адресу 0 xB 8000000+160* y +2* x +1 .

Байт атрибутов состоит из разрядов

где IRGB – код цвета символа, а rgb – код цвета фона. В некоторых текстовых режимах установленный бит bl вызывает мерцание символа. Например, если байт атрибутов равен 15, то цвет фона будет черным. Поскольку 15=1111 b , то этот байт атрибутов устанавливает цвет символа ярким (бит I ) и равным смеси красного ( R ), зеленого ( G ) и синего ( B ). В результате символ будет белым, а его фон – черным.

Пример 6. Напишем подпрограмму записи строки с одинаковыми атрибутами на экран. Строка заканчивается нулём:

void write_string(int x, int y, char *p, int attrib)

{

register int i;

char far *v=(char far *)0xB8000000;

v+=160*y+2*x;

for ( i =0; (* p )&&( i <79); i ++) //не больше 79 символов

{

*v++=*p++; *v++=attrib;

}

}

Пример 7. Подпрограмма записи символа и атрибута в позицию ( x , y ):

void write_char(int x, int y, char ch, int attrib)

{

register int i;

char far *v=(char far *)0xB8000000;

v += x*160+2*y;

* v ++ = ch ; //запись символа

* v = attrib ; //запись атрибута

}

Для того чтобы вводить с клавиатуры символ и его скан-код, можно применить функцию

int getch ();

возвращающую код введенного с клавиатуры символа. Если введен один из управляющих символов, например F 1 или F 2 , то эта функция возвращает значение 0 . В этом случае за нулём следует управляющий код нажатой клавиши. Например, операции:

int a = getch ();

if(a==0) if(getch()==59)

printf (“\ n Помощь...”);

будут выводить слово «Помощь…», если была нажата клавиша F 1.

Другой способ приёма управляющих кодов – применение функции bioskey() . Вызов bioskey(1) проверяет нажата ли клавиша, и возвращает 0, если не нажата. Вызов

int a=bioskey(0);

записывает в младшие разряды код введенного символа. Если нажата управляющая клавиша, то эти младшие разряды равны 0, а код записывается в старший байт слова a .

up