С для профессиональных программистов

Сохранение части экрана.


Для сохранения содержимого экрана, должно быть прочитано и запомнено текущее значение каждой позиции экрана. Для считывания символа с определенной позиции экрана, используется прерывание 16, функция 8, которая возвращает символ и связанный с ним аттрибут текущей позиции курсора. Для считывания символа с определенного места экрана, вы должны иметь способ установки курсора. Хотя некоторые компиляторы Си поддерживают эту функцию, многие ее не имеют. Тем не менее показанная ниже функция goto_xy() может быть использована. Она использует прерывание 16, функцию 2 с координатой столбца в DL и координатой ряда в DH. Видеостраница задается в ВН (используется страница 0 по умолчанию).

/* установка курсора в x,y */

int x,y;

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

/* сохранение части экрана */

int   startx,endx,starty,endy;

union REGS r;

register int i,j;

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

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

goto_xy(j,i);

r.h.ah=8; /* функция чтения символа   */

r.h.bh=0; /* видео страница                                                   */

*buf_ptr++ = int86(0x10,&r,&r);

putchar(' '); /* очистка экрана */

верхнего  левого  и  правого  нижнего  угла  сохраняемой области.

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

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



Содержание раздела