Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование видеоадаптеров 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);
}
[Назад] [Содеожание] [Дальше]