Смена страницы в графическом режиме - Free Pascal
Формулировка задачи:
Здравствуйте. Возникла такая проблема: Среди функций модуля Grapg есть 2 - SetVisualPage и SetActivePage, которые позволяют устанавливать активную страницу видеорежима, и страницу, на которую происходит вывод (естественно в тех режимах, которые имеют несколько страниц, напр. VGA). Таким образом, чередуя вывод на скрытую страницу, и её показ можно реализовать анимацию, без ряби. Но я обнаружил, что у меня режим не переключается вообще. Т.е. если в примере ниже(простейшем, взятым с сайта с описанием функции) убрать SetVisualPage(1);, то по идее на экране ничего не должно появиться, т.к. вывод шел бы на 1 страницу а показ был бы нулевой. Но у меня рисуется квадрат, что означает, отсутствие смены страницы. Собственно вопрос: Почему так, и как сделать смену, т.к. в мне очень нежелательно было бы иметь дрожание картинки при перерисовке
uses Graph;
var
Gd, Gm : Integer;
begin
Gd := VGA;
Gm:= VGAMED;
InitGraph(Gd, Gm, 'X:\BP');
if GraphResult <> grOk then
Halt(1);
if (Gd = HercMono) or (Gd = EGA) or (Gd = EGA64) or (Gd = VGA) then
begin
SetVisualPage(0);
SetActivePage(1);
Rectangle(10, 20, 30, 40);
SetVisualPage(1);
end
else
OutText('No paging supported.');
ReadLn;
CloseGraph;
end.
И вот ещё вопрос: у меня стоят Freepascal и Win8. Когда я запускаю в приложении графический режим, и пытаюсь отловить символы функцией readkey, они ловятся, НО только если фокус стоит на консольном окне, а не на окне с графикой. Можно-ли заставить читать символы с клавиатуры графическое окно?
Решение задачи: «Смена страницы в графическом режиме»
textual
Листинг программы
uses Graph,wincrt;
var
Gd, Gm : Integer;
begin
Gd := VGA;
Gm:= VGAMED;
InitGraph(Gd, Gm, 'X:\BP');
repeat
SetVisualPage(0);
{рисуем квадрат}
Rectangle(100, 100, 300, 300);
SetActivePage(1);
delay(1000);
cleardevice;
SetVisualPage(1);
circle (200, 300, 100);
delay(1000);
SetActivePage(1);
cleardevice;
until keypressed
end.
Объяснение кода листинга программы
- Используется графический режим VGA и VGAMED.
- Инициализируется графика с помощью функции InitGraph.
- Программа зациклена и повторяет следующие действия:
- Смена активной страницы на 0.
- Рисуется прямоугольник на экране с помощью функции Rectangle.
- Задержка в 1 секунду с помощью функции delay.
- Смена активной страницы на 1.
- Рисуется окружность на экране с помощью функции circle.
- Задержка в 1 секунду с помощью функции delay.
- Смена активной страницы на 1.
- Очистка экрана с помощью функции cleardevice.
- Программа повторяет эти действия до тех пор, пока не будет нажата клавиша.