Вспомогательные функции. Функция 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; просмотров: 1532;