Программирование видеоадаптеров CGA, EGA и VGA© Александр Фролов, Григорий ФроловТом 3, М.: Диалог-МИФИ, 1992, 287 стр. 14.11. Функции _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); } |