Программирование видеоадаптеров CGA, EGA и VGA

       

Функции _setactivepage(), _setvisualpage(), _getactivepage() и _getvisualpage()


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

Функция _setactivepage() направляет вывод информаци в определенную страницу видеопамяти, а функция _setvisualpage() задает страницу, которая отображается в данный момент на экране. Функции управления страницами видеопамяти могут использоваться совместно с функциями _gettextcursor(), _settextcursor(), _settextposition(), _gettextposition(), _outtext(), _gettextcolor(), _settextcolor(), _settextwindow().

Функция управления страницами видеопамяти имеет следующий прототип:

short _setactivepage( short page );

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

Если функция выполнилась успешно, то она возвращает номер предыдущей активной страницы. При возникновении ошибки возвращаемая величина равна -1. Ошибка может произойти в случае задания номера страницы видеопамяти, не поддерживаемого адаптером в данном режиме.

Приведем прототип функции:

short _setvisualpage( short page );

Параметр функции задает номер страницы, отображаемой на экране дисплея. Функция возвращает номер предыдущей отображаемой страницы. При возникновении ошибки возвращаемая величина равна -1. Ошибка может произойти, например, в случае задания номера страницы видеопамяти, не поддержиеваемой адаптером. Смена отображаемой страницы в этом случае не происходит.

short _getactivepage( void );

Функция _getactivepage() возвращает номер текущей активной страницы видеопамяти.

Следующая функция, _getvisualpage(), возвращает номер страницы видеопамяти, отображаемой на экране дисплея в данный момент. Ее прототип:

short _getvisualpage( void );

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

// Пример использования функций _setactivepage(), _setvisualpage(), // _getactivepage() и _getvisualpage().




#include <stdlib.h> #include <graph.h> #include <time.h>

void main(void) { short old_vpage, old_apage, page, row;

struct videoconfig vc; char buffer[80]; long wait = 0; clock_t end;

// определяем конфигурацию видеосистемы

_getvideoconfig(&vc);

// завершаем программу, если поддерживается только одна // страница видеопамяти

if(vc.numvideopages<2) exit(1);

// сохраняем номера активной и отображаемой страниц видеопамяти

old_apage = _getactivepage(); old_vpage = _getvisualpage();

// записываем на каждой из страниц ее номер

for(page = 0; page < vc.numvideopages; page++) {

// изменяем активную страницу видеопамяти

_setactivepage(page); _clearscreen(_GCLEARSCREEN); sprintf(buffer, "страница видеопамяти номер %d", page); for(row = page + 1; row < 26; row += vc.numvideopages) { _settextposition(row, 35); _outtext(buffer); } }

while(!kbhit()) for(page = 0; page < vc.numvideopages; page++) {

// меняем отображаемую страницу видеопамяти

_setvisualpage(page);

// производим постепенно увеличивающуюся задержку

for(end = clock() + wait++; clock() < end;); }

getch();

// восстанавливаем активную и отображаемую страницы

_setactivepage(old_apage); _setvisualpage(old_vpage); }


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