19.7. Управление видеостраницами

Память видеоадаптеров разделена на так называемые страницы, или видеостраницы. По умолчанию в графическом режиме действия производятся с нулевой страницей, поэтому практически во всех предыдущих примерах было видно, как рисуются на экране фигуры. Однако, если направить вывод изображений на ненулевую страницу (при условии, что такая доступна в текущем режиме видеоадаптера — см. табл. 19.4), то на экране ничего не отобразится, поскольку по умолчанию видимой является нулевая страница. Если же после этого дать команду считать видимой «скрытую» страницу, то она появится на экране буквально мгновенно (конкретно: за один прямой проход луча в кинескопе). Проделать все это позволяют две процедуры:

SetVisualPage(Page : Word)

которая устанавливает «видимой» на экране видеостраницу номер Page, и процедура

SetActivePage( Page : Word )

- 455 -

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

На рис. 19.30 показан типичный пример использования этих процедур.

| (* Пример только для адаптеров EGA и VGA !!! *)

| USES Graph, CRT; { используется Graph и CRT }

| {$I initgraf.pas} { процедура инициализации }

| PROCEDURE Forms(kadr:Byte);

| { рисование кадров 0..3 }

| CONST

| Radius : Array [0..3] of Integer = (20, 40, 60, 80);

| VAR r, rr : Integer; { радиусы эллипсов в кадрах }

| BEGIN

| r := Radius[kadr]; { максимальный радиус }

| rr := 0; { радиус вложенного эллипса }

| repeat

| Ellipse(GetMaxX div 2,GetMaxY div 2, 0, 360, r, rr);

| Inc(rr, 5) until rr>=r;

| END;

| PROCEDURE AnimEGAVGA; { процедура смены кадров }

| CONST ms = 60; { задержка между кадрами, мс }

| VAR i : Byte; { параметр циклов смены }

| BEGIN

| Repeat { цикл до нажатия клавиши... }

| for i:=0 to 3 do

| begin

| { Смена видеостраниц: прямо }

| SetVisualPage(i); Delay( ms )

| end;

| for i:=3 downto 0 do

| begin { ... и обратно }

| SetVisualPage(i); Delay(ms)

| end;

| until KeyPressed;

| { условие окончания показа }

| END;

| VAR (* ОСНОВНАЯ ЧАСТЬ ПРИМЕРА *)

| i : Byte; { параметр (номер кадра) }

| BEGIN

| GrInit; { инициализация графики }

| SetGraphMode( EGALo ); { режим EGA, 640x200, 4 стр. }

Рис. 19.30

- 456 -

| for i:=3 downto 0 do

| begin { Цикл заполнения страниц: }

| SetVisualPage(Succ(i) mod 4);

| { Видим пустоту }

| SetActivePage(i);

| {и готовим кадр }

| Forms(i) { рисунок кадра }

| end; {for}

| AnimEGAVGA;

| { начало оживления кадров }

| CloseGraph { закрытие режима графики }

| END.

Рис. 19.30 (окончание)

Здесь показано использование процедур SetActivePage и SetVisualPage для алгоритма «кадровой» мультипликации. Особенность ее заключается в том, что все кадры (здесь их четыре) сначала записываются на соответствующие страницы, а затем производится последовательное переключение отображения страниц на дисплей процедурой SetVisualPage.