Вспомогательные функции. Функция save_video


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

Функция save_video(), выполняющая сохранение части экрана, перекрываемой меню, в первых четырех параметрах получает информацию о той части области экрана, которая должна перекрываться. Пятый параметр – ссылка на буфер для сохранения кодов символов с аттрибутакми.

void save_video(int startx, int endx, int starty, int endy, unsigned int *buf_ptr)

{

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

// endx, endy – нижнего правого угла прямоугольника для сохранения

// buf_ptr – ссылка на начало буфера для сохранения содержимого видеопамяти

register int i,j; int k;

register unsigned _es * work; // ES-базированный короткий указатель

extern int vid_mem;

_ES = FP_SEG(vid_mem); // загрузка регистра базовым адресом

k = FP_OFF(vid_mem); //начальное смещение в k

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

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

{

work = (unsigned _es *)(j*160 + i*2 +k);

* buf_ptr++ = *work++;

// очистка окна

* (work – 1) = (unsigned) ‘ ‘ | *(buf_ptr – 1) & 0xff00;

}

}

В программе используются макрокоманды FP_SEG() и FP_OFF(), аргументом которых должен быть far-указатель. Макрокоманды возвращают в качестве результата, соответственно, значение базового адреса (параграфа) и смещение относительно базового адреса.

Функция draw_border() выводит рамку на экран. Первые 2 параметра – координаты левого верхнего угла для вывода рамки, ограничивающей прямоугольник, следующие 2 параметра – координаты правого нижнего угла. Вначале пишется символ и затем атрибут, во все те адреса видеопамяти, которые соответствуют расположению рамки. Пересчёт координат делается аналогично тому, как это делается в save_video(). Коды символов необходимо подобрать из таблицы кодов ASCII. Например можно рисовать рамку точками. Другой вариант применить следующие коды: 179 – вертикальная линия, 196 – горизонтальная линия, 191, 192, 217, 218 – различные типы «углов» для рамки, - правого верхнего, левого нижнего, правого нижнего и левого верхнего, соответственно.

Функция restore_video() «обратна» функции save_video() и копирует содержимое буфера, на который ссылается p в видеопамять.

Функция write _string() выполняет вывод строки на экран (в видеобуфер) с заданным атрибутом.

write_string(int x, int y, char *p, int attrib) // x, y – координаты вывода строки

{

register int i; int k;

register unsigned _es *work;

extern int vid_mem;

_ES = FP_SEG(vid_mem);

k = FP_OFF(vid_mem);

work = k + (x*160)+y*2+k;

for(i=y; *p; i++)

*work++ = (unsigned)(attrib)|*p++;

}



Дата добавления: 2016-05-26; просмотров: 1538;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.