Смена страницы в графическом режиме - 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.

Объяснение кода листинга программы

  1. Используется графический режим VGA и VGAMED.
  2. Инициализируется графика с помощью функции InitGraph.
  3. Программа зациклена и повторяет следующие действия:
    • Смена активной страницы на 0.
    • Рисуется прямоугольник на экране с помощью функции Rectangle.
    • Задержка в 1 секунду с помощью функции delay.
    • Смена активной страницы на 1.
    • Рисуется окружность на экране с помощью функции circle.
    • Задержка в 1 секунду с помощью функции delay.
    • Смена активной страницы на 1.
    • Очистка экрана с помощью функции cleardevice.
  4. Программа повторяет эти действия до тех пор, пока не будет нажата клавиша.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.733 из 5
Похожие ответы