Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП 1,2.doc
Скачиваний:
11
Добавлен:
05.11.2018
Размер:
2.77 Mб
Скачать

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

например,

pokeb(0xB800, 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) соответствует два байта – код символа и атрибут. Код символа находится по адресу 0xB8000000+160*y+2*x, байт атрибута – по адресу 0xB8000000+160*y+2*x+1.

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

где IRGB – код цвета символа, а rgb – код цвета фона. В некоторых текстовых режимах установленный бит bl вызывает мерцание символа. Например, если байт атрибутов равен 15, то цвет фона будет черным. Поскольку 15=1111b, то этот байт атрибутов устанавливает цвет символа ярким (бит 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();

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

int a=getch();

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

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

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

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

int a=bioskey(0);

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

2. Исчезающее меню

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

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

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

2.1. Алгоритм создания исчезающего меню

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

Эта подпрограмма имеет список опций в качестве параметра и будет возвращать целое число, равное номеру опции, выбранной пользователем.

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

Значение номера выбранной опции определяется либо передвижением освещенной области на нужное поле и нажатием клавиши <ENTER>, либо нажатием ''горячей'' клавиши, обычно соответствующей первой букве выбранной возможности. В подпрограмму исчезающего меню должны быть переданы строка, состоящая из ''горячих'' клавиш, позиция левого верхнего угла области вывода меню и количество опций. Определим прототип этой подпрограммы:

int popup (char *menu[], // текст меню

char * keys, // горячие клавиши

int count, // количество опций

int x, int y, // координаты левого верхнего угла

int border); // если 0, то без рамки

Последовательность действий подпрограммы popup():

  • сохраняет область вывода меню;

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

  • выводит меню;

  • получает от пользователя номер выбранной опции;

  • восстанавливает экран в исходное состояние;

  • возвращает номер выбранной опции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]