Стандартний модуль бібліотеки GraphABC

Модуль GraphABC.

Модуль GraphABC є графічною бібліотекою, яка призначена для створення простих графічних програм з елементами анімації. Додатково, в модулі GraphABC можуть бути визначені найпростіші події миші і клавіатури, що дозволяє створювати елементарні програми із певними подіями. Основна сфера використання модуля GraphABC – навчання.

У модулі GraphABC визначено ряд констант, типів, процедур, функцій і класів для малювання в графічному вікні.

Графічні примітиви.

Графічні примітиви – представляють собою окремі процедури, які будують різноманітні графічні фігури в спеціальному вікні, їх відображення виконується безперервно пером (лінією), поточної пензлем (заливка замкнутих областей) і поточним шрифтом (виведення строк).

З усім різноманіттям процедур, які будують стандартні графічні примітиви можна ознайомитися на сайті

pascalabc.net (розділ стандартні модулі -> модуль GraphABC). Розглянемо одну з них.

procedure Line(x1, y1, x2, y2: integer); // малює відрізок від точки (x1, y1) до точки (x2, y2).

Приклад: скласти програму, яка буде виводити на графічний екран звичайну лінію.

  • Program DrawLine;
  • Uses GraphABC;
    // підключаємо графічну бібліотеку
  • begin
    • Line(50,50,300,50);
  • end.

Зверніть увагу, для щоб інтерпретатор середовища програмування PascalABC розпізнав процедуру Line і відобразив відповідний графічний примітив, треба в програмі обов’язково підключити графічну бібліотеку GraphABC.

Підпрограми для роботи з пером.

Малювання ліній здійснюється поточним пером. Доступ до властивостей поточного пера можна здійснювати за допомоги відповідних процедур та функцій, розглянемо деякі з них:

procedure SetPenColor(c: Color); // встановлює колір поточного пера.
procedure SetPenWidth(Width: integer); // встановлює ширину поточного пера.
procedure SetPenStyle(style: DashStyle); // встановлює стиль поточного пера.

Приклад: скласти програму, яка буде виводити на графічний екран широку пунктирну лінію синього кольору.

  • Program DrawLine;
  • Uses GraphABC;
  • begin
    • SetPenColor(clBlue);
    • SetPenStyle(psDash);
    • SetPenWidth(6);
    • Line(50,50,300,50);
  • end.

Підпрограми для роботи з пензлем.

Малювання замкнутих областей здійснюється поточним пензлем. Доступ до його властивостей можна здійснювати за допомоги відповідних процедур та функцій, розглянемо деякі з них:

procedure SetBrushColor(c: Color); // встановлює колір поточного пензля.

Приклад: скласти програму, яка буде виводити на графічний екран квадрат червоного кольору з широким синім контуром.

  • Program DrawRectangle;
  • Uses GraphABC;
  • begin
    • SetBrushColor(clRed);
    • SetPenColor(clBlue);
    • SetPenWidth(6);
    • Rectangle(50,50,300,300);
  • end.

Підпрограми для роботи з текстом.

Виведення тексту здійснюється поточним шрифтом. Доступ до властивостей поточного шрифту можна здійснювати за допомоги відповідних процедур та функцій, розглянемо деякі з них:

procedure SetFontSize(size: integer); // встановлює розмір поточного шрифту в пунктах.
procedure SetFontName(name: string); // встановлює ім’я поточного шрифту.
procedure SetFontColor(c: Color); // встановлює колір поточного шрифту.
procedure SetFontStyle(fs: integer); // встановлює стиль поточного шрифту.

Приклад: скласти програму, яка буде виводити на графічний екран напис «Hello World». Для тексту задати наступні параметри: розмір шрифту – 26pt, колір – синій, накреслення – напівжирний, в якості основного шрифту обрати – Garamond.

  • Program DrawText;
  • Uses GraphABC;
  • begin
    • SetFontSize(26);
    • SetFontName('Garamond');
    • SetFontColor(clBlue);
    • SetFontStyle(fsBold);
    • TextOut(50,50, 'Hello World');
  • end.

Підпрограми для роботи з графічним вікном.

Доступ до властивостей графічного вікна можна здійснювати за допомоги відповідних процедур та функцій, розглянемо деякі з них:

procedure SetWindowSize(w,h: integer); // встановлює розміри графічного вікна в пікселях
procedure SetWindowTitle(s: string); // встановлює заголовок графічного вікназ.
procedure CenterWindow; // встановлює графічне вікно по центру екрана.
procedure ClearWindow(c: Color); // очищує графічне вікно заданим кольором.
procedure CloseWindow; // закриває графічне вікно і завершує виконання програми.

Приклад: скласти програму, яка буде виводити по центру монітора графічний екран і скривати його через 3 секунди. Для графічного екрану встановити наступні параметри: розмір – 600х300 px, заголовок – «Window», колір вікна – синій.

  • Program GraphWindow;
  • Uses GraphABC;
  • begin
    • SetWindowSize(600,300);
    • SetWindowTitle(‘Window’);
    • CenterWindow;
    • ClearWindow(clblue);
    • Sleep(3000);
    • CloseWindow;
  • end.

Події модуля GraphABC.

Графічне вікно, що використовується бібліотекою GraphABC для відображення графічних примітивів може також реагувати на події миші чи клавіатури, події зміни розмірів вікна та на подію закриття вікна. Дані події визначені в модулі GraphABC і являють собою процедурні змінні, розглянемо декілька з них:

OnResize: procedure; // подія зміни розміру графічного вікна.

Приклад: скласти програму, яка буде виводити по центру монітора графічний екран розміром 600х300px, яке буде спочатку зафарбоване зеленим кольором, при зменшенні вікна до розміру 400х200px вікно перекраситься у синій колір, а при його збільшенні до розміру 800х400px у червоний.

  • Program GraphWindow;
  • Uses GraphABC;
  • procedure WindowRes;
  • begin
    • if (WindowWidth <= 400) and (WindowHeight <= 200)
      • then
        • ClearWindow(clBlue)
    • else if (WindowWidth >= 600) and (WindowHeight >= 400)
      • then
        • ClearWindow(clRed)
    • else
      • ClearWindow(clGreen);
  • end;
  • begin
    • SetWindowSize(600,300);
    • CenterWindow;
    • ClearWindow(clGreen);
    • OnResize := WindowRes;
  • end.

Треба звернути увагу, OnResize це змінна, яка приймає значення, що повертає процедура WindowRes.

OnKeyDown: procedure (key: integer); // подія натискання клавіші. key – віртуальний код натиснутої клавіші.

Приклад: скласти програму, яка буде виводити графічний екран на в центрі якого буде намальоване коло радіусом 100px. При натисканні клавіші 🡅 круг буде збільшуватися на 10px, при натисканні клавіші 🡇 зменшуватися на 10px.

  • Program ResizeCircle;
  • Uses GraphABC;
  • var
    • R: integer;
  • procedure KeyPres(k: integer);
    • begin
      • if (k = VK_Up)
        • then
          • := R + 10
      • else if (k = VK_Down)
        • then
          • R := R – 10;
      • Window.Clear;
    • end;
  • begin
    • R := 100;
    • SetWindowSize(600, 300);
    • CenterWindow;
    • SetBrushColor(clBlue);
    • SetPenColor(clBlue);
    • LockDrawing;
    • repeat
      • Redraw;
      • Sleep(1);
      • Circle(300, 150, R);
      • onKeyDown := KeyPres;
    • until (false);
  • end.

В програмі були застосовані наступні процедури LockDrawing та Redraw, для того щоб коло перемальовувалося кожного разу, коли будуть натиснуті відповідні клавіші. Основна ідея полягала в наступному: спочатьку, викликавши процедуру LockDrawing відключили малювання на екрані, далі, щоразу викликаючи процедуру Redraw, при зміні парамертів кола, формуємо новий кадр зображення і виводимо його на екран. Але при виклику Redraw перемальовується все графічне вікно, і швидкість анімації обмежена швидкістю виведення зображення на екран. В цьому випадку зображення блимає, щоб уникнути такого ефекту потрібно поставити затримку виведення зображення за допомоги процедури Sleep.

OnMouseDown: procedure (x, y, mousebutton: integer); // подія на натискання кнопки миші, де x, y – координати курсору миші в момент настання події, mousebutton – приймає значення 1 або 2, коли відповідно натиснута ліва чи права клавіша миші.

Приклад: скласти програму, яка буде виводити графічний екран в центрі якого буде намальоване коло радіусом 100px, додатково зліва від зображення будуть знаходитися дві кнопки зі знаками плюс (+) та мінус (-), при натисканні на котрі коло буде відповідно збільшуватися або зменшуватися.

  • Program ResizeCircle;
  • Uses GraphABC;
  • var
    • R, xk, yk, a: integer;
  • procedure Krug;
    • begin
      • SetBrushColor(clBlue);
      • SetPenColor(clBlue);
      • Circle(400, 250, R)
    • end;
  • procedure Buttons;
    • begin
      • SetBrushColor(clGreen);
      • SetPenColor(clGreen);
      • Rectangle(50,150,100,200);
      • Rectangle(50,250,100,300);
      • SetFontSize(26);
      • SetFontName('Arial');
      • SetFontColor(clWhite);
      • SetFontStyle(fsBold);
      • TextOut(65,158, '+');
      • TextOut(68,253, '-');
    • end;
  • procedure MausePres(xm, ym, mb: integer);
    • begin
      • xk := 50;
      • yk := 150;
      • if (mb = 1) and (xm > xk) and (xm < xk + a) and (ym > yk) and (ym < yk + a)
        • then
          • R:= R + 10;
      • xk := 50;
      • yk := 250;
      • if (mb = 1) and (xm > xk) and (xm < xk + a) and (ym > yk) and (ym < yk + a)
        • then
          • R:=R - 10;
      • Window.Clear;
    • end;
  • begin
    • R := 100;
    • a := 50;
    • SetWindowSize(800, 500);
    • CenterWindow;
    • LockDrawing;
    • repeat
      • Redraw;
      • Sleep(1);
      • Buttons;
      • Krug;
      • OnMouseDown := MausePres;
    • until (false);
  • end.