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

2.2. Сохранение и восстановление экрана

В текстовом режиме адрес начала видеопамяти обычно равен В8000h. В некоторых текстовых режимах он имеет значение В0000h.

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

char far *vid_mem;

значение которого устанавливается в главной программе, например, с помощью операторов

int vmode = video_mode(); // определение режима с помощью

//подпрограммы из пп. 1.5 (пример 1)

if (vmode == 7)

vid_mem = (char far *) 0xB0000000; // монохромный режим

else

vid_mem = (char far *) 0xB8000000; // цветной режим

Мы будем предполагать, что установлен один из режимов 2, 3 или 7.

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

unsigned *buf_ptr

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

void save_video (int startx, int endx, int starty, int endy,

unsigned *buf_ptr)

// (startx, starty) – координаты левого верхнего угла

// (endx, endy) - координаты правого нижнего угла

{

register int i, j; // счетчики строки и столбца

char far *v, far *t; // указатели на видеопамять

v = vid_mem; // начало видеопамяти

for (i=starty; i<=endy; i++)

for (j=startx; j<=endx; j++)

{

t = v+160*i+2*j; // адрес символа и атрибута

*buf_ptr++ = *t++; // сохранение символа

*buf_ptr++ = *t; // сохранение атрибута

}

}

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

void restore_video (int startx, int endx, int starty, int endy,

unsigned *buf_ptr)

{

register int i, j;

char far *v, far *t; // указатели на видеопамять

v = vid_mem;

t = v;

for (i=starty; i<=endy; i++)

for (j=startx; j<=endx; j++)

{

v = t+160*i+2*j;

*v++ = *buf_ptr++; // восстановление символа

*v = *buf_ptr++; // восстановление атрибута

}

}

2.3. Вывод меню и рамки

После сохранения области вывода меню, согласно пп. 2.1, выводится рамка и меню. Текст опций меню составляет массив строк и определяется, например, следующим образом:

char *menu[] =

{

“Цвет текста”,

“Цвет фона”,

“Эхо”,

“Выход”

};

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

void display_menu (char *menu[], int startx, int starty, int endx,

int endy, int count) // вывод меню на экран

{

register int i, j;

for (i=starty; i<=endy; i++)

for (j=startx; j<=endx; j++)

write_char (j, i,' ', 7); // закраска области

for (i=0; i<count; i++, starty++)

write_string (startx, starty, menu[i],7);

}

Здесь мы использовали подпрограммы write_char() и write_string() из пп.1.5 (примеры 6 - 7). Байт атрибута равен 7, следовательно, подпрограмма будет выводить строки меню белым цветом на черном фоне.

Для вывода рамки будем использовать коды символов псевдографики: 218 для левого верхнего угла, 191 – для правого верхнего, 192 – для левого нижнего, 217 – для правого нижнего, 196 – для верхней и нижней строк и 179 – для боковых столбцов.

void draw_border (int startx, int starty, int endx, int endy)

{

register int i;

write_char(startx, starty, 218, 7);

write_char(endx, starty, 191, 7);

write_char(startx, endy, 192, 7);

write_char(endx, endy, 217, 7);

for (i = startx+1; i<endx; i++)

{

write_char (i, starty, 196, 7);

write_char (i, endy, 196, 7);

}

for (i = starty+1; i<endy; i++)

{

write_char (startx, i, 179, 7);

write_char (endx, i, 179, 7);

}

}

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