Лекція 2 Графічна бібліотека на початку своєї роботи визначає тип адаптера і завантажує



Скачати 95.32 Kb.
Дата конвертації02.01.2017
Розмір95.32 Kb.
Лекція 2
Графічна бібліотека на початку своєї роботи визначає тип адаптера і завантажує відповідний драйвер. Цим досягається машинна незалежність написаних програм.

Розглянемо роботу однієї з найбільш популярних графічних бібліотек - бібліотеку компілятора Borland Pascal.

Для підключення графічного модуля Graph в декларативній частині програми необхідно вписати директиву uses graph. Щоб стандартні функції, що знаходяться в модулі, і процедури стали доступні програмістові з моменту підключення модуля Graph, необхідно провести ініціалізацію бібліотеки:
Процедура ініціалізації Initgraph.

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


InitGraph (var GraphDriver, GraphMode : integer; : string),
де
GraphDriver - тип адаптера

Graphmode - режим графіки

Driverpath - шлях до драйвера
У модулі Graph визначені константи для завдання виду графічного адаптера параметром Graphdriver перед викликом Initgraph


CONST

Detect = 0;

CGA =1;

HCGA = 2;



EGA = 3;

EGA64 = 4;

EGAMono = 5;

IBM8514 = 6;

HercMono = 7;

ATT400 = 8;

VGA = 9;

PC3270 = 10;

CurrentDriver =-128;
{ автовизначення }

{ адаптер CGA }

{ адаптер MCGA }

{ адаптер EGA 256K }

{ адаптер EGA 64K }
{ EGA з моно-дисплеєм }

{ адаптер 8514 }

{ адаптер Hercules }

{ для ПЭВМ AT&T }

{ адаптер VGA }

{ адаптер 3270 }

{ для GetModeRange >

Якщо параметру Graphdriver привласнити значення константи Detect, то система включиться в режим автовизначення. Якщо можливе перемикання системи в графічний режим, то ініціалізувався відповідний BGI-драйвер і включається режим з максимальним дозволом.

Така установка параметрів процедури рекомендується в тих випадках, коли програма повинна працювати на різних ПЕВМ з різними відеоадаптерами. Цей метод припускає наявність в пам'яті ПК всіх драйверів.

Якщо ж параметр Graphdrive містить номер конкретного адаптера, то і другий параметр, Graphmode, повинен мати значення режиму, доступного при цьому адаптері.


Другий параметр Graphmode визначає режим.

Режим Значення Дозвіл екрану



CGACo, CGAHi 0 , 4 320x200 (640x200)

EGALo, EGAHi 0 , 1 640x200 (640x350)

VGALo 0 640x200

VGAMed 1 640x350

VGAHi 2 640x480

HercMonoHi 0 720x348

Параметр Graphdriver може задаватися по імені або цифрою.


Наприклад:

Graphdriver := VGA; або Graphdriver := 9;

Наприклад:

Graphdriver := VGA, Graphmode := Vgamed

Параметр Driverpath указує шлях, де знаходиться драйвер: ‘W:\bp\bgi’ або ‘G:\

program PRIMER;

USES Graph;

VAR Grd,Grm:integer;


BEGIN

Grd := Detect;

InitGraph (Grd, Grm, ’G:\’);

.

.



.

program EXAMPLE;

USES Graph;

VAR Grd, Grm : integer;

BEGIN

Grd := VGA;



Grm := 1;

InitGraph (Grd, Grm,’’);

.

.

.



Процедура Closegraph.
Для остаточного завершення роботи в графічному режимі необхідно завжди проводити виклик процедури Closegraph. Ця процедура не має параметрів. Вона очищає екран, переводить адаптер в текстовий режим і, якщо можливо, вивантажує з пам'яті всі BGI-драйвери і штрихові шрифти. Подальше повернення в графічні режими можливе тільки через повторну ініціалізацію.

Обробка помилок


При ініціалізації графіки можуть виникнути помилки. Повідомлення про тип помилці, що відбулася, виводить функція

GraphErrorMsg (ErrorCode : Integer ) : String.


Константи код помилок, визначені в модулі Graph, приведені в наступній таблиці.



Константа

Код

Повідомлення про помилку

Переклад і пояснення

grOk

0

No error

Помилки немає


grNoInitGraph

-1

(BGI) Graphics not installed (use InitGraph)

Графіка не ініціалізована


grNotOetected

-2

Graphics hardware not detected

Графічний адаптер не знайдений


GrFileNotFound

-3

Device driver file not detected

BGI -файла немає у вказаному каталозі


GrlnvalidDriver

-4

Invalid device driver file

BGI-файл містить помилковий код


GrNoLoadMem

-5

Not enough шелюгу to load driver

Немає місця в ОЗУ для завантаження драйвера


GrNoScanMem

-6

Out of memory in scan fill

При роботі процедури Fillpoly не вистачає робочої пам'яті


GrNoFloodMem

-7

Out of memory in flood fill

При роботі процедури Floodfill не вистачає робочої пам'яті


grFontNotFound

-8

Font file not found

CHR-файла немає у вказаному каталозі


grNoFontMem

-9

Not enough memory to load font

Немає місця в ОЗУ для завантаження шрифту


grlnvalidHode

-10

Invalid Graphics mode for selected driver

Неможливий режим для вибраного драйвера


grError

-11

Graphics error

Помилка графіки


grIOError

-12

Graphics I/O error

Помилка введення-виводу графіки


grlnvalidFont

-13

Invalid font file

У файлі шрифту неправильний код


grlnvalidFontNum

-14

Invalid font number

Неіснуючий номер шрифту


grlnval idDeviceNum

-15

Invalid device number

Неіснуючий номер адаптера

У модулі Graph реалізований спосіб перевірки результату операції ініціалізації. Результат зберігається в стандартній функції Graphresult : integer; Graphresult повертає значення 0, якщо остання графічна операція виконалася без помилок, або число в діапазоні 1 .. 15, якщо була помилка. АЛЕ! Після одного виклику Graphresult, наступний її виклик дасть нульовий результат. Тому, для подальшого використання результатів тестування необхідно зберегти значення в якій-небудь змінній.


Простий блок ініціалізації графічного режиму в програмі може виглядати, як показано нижче
USES Graph; { підключений модуль Graph }

PROCEDURE Grlnit; { ініціалізація режиму графіки }

VAR

GraphDriver : Integer; { для графічного адаптера}



GraphMode : Integer; { для графічного режиму }

ErrorCode : Integer; { для коду помилки }


BEGIN

GraphDriver := Detect; { режим автовизначення }

InitGraph(GraphDriver,GraphMode,"); { ініціалізація }

ErrorCode := GraphResult; { результат ініціалізації }

if ErrorCode <> grOk then { якщо не успішно, то... }

begin


WriteLn(‘Помилка графіки:', GraphErrorMsg (ErrorCode));

WriteLn('Програма зупинена.' );

Halt( 1 )

end {if}

END;

{ == ПРИКЛАД ІНІЦІАЛІЗАЦІЇ == }

{виклик ініціалізації }

{робота з графікою... }

{пауза до натиснення введення }

{закриття режиму графіки }

BEGIN

Grlnit;


Line(0,0,GetMaxX,GetMaxY);

ReadLn;


CloseGraph

END.
Аналіз графічних режимів


В світі проводиться величезна кількість різних адаптерів, які є модифікаціями основних адаптерів, приведених в таблиці. Кожна модифікація вирішує завдання, зв'язані, наприклад, із збільшенням швидкодії, дозволу або сумісності з яким-небудь іншим типом адаптера. При цьому в такому адаптері завжди зберігається стандартний блок, що дозволяє працювати в будь-якому з режимів, вказаних в таблиці для нього. Для того, щоб повністю використовувати можливості встановленого в ПЕВМ адаптера, необхідно скористатися інструкцією по роботі з ним.
Процедура DetectGraph.
Для тестування графічного адаптера в модулі Graph оголошена процедура:

DetectGraph( VAR GraphDriver, GraphMode : Integer )


Ця процедура може бути викликана до ініціалізації графіки. Формальні параметри Graphdriver і Graphmode рекомендується підставляти в якості фактичних параметрів в процедуру Initgraph. Якщо на ПЕВМ не установлена графічна плата, то функція Graphresult повертатиме значення grnotdetected. Після визначення Graphdriver автоматично стає доступним діапазон графічних режимів, ПЕВМ, що реалізовуються адаптером. Річ у тому, що у міру розвитку індустрії ПЕВМ виникали нові рівні можливостей графіки (мал. 19.2).

  • процедура Detectgraph (var Grd, Grm : integer) повертає номери поточного адаптера і режиму. Ця процедура викликається до ініціалізації графіки, і її параметри потім використовуються в Initgraph.

  • функції Getgraphmode : integer і Getmaxmode : integer повертають відповідно номер поточного і максимального режимів.

  • процедура Getmoderange (Grd : integer; var Lomode, Himode : integer) повертає нижню і верхню межі режимів.

  • функція Getmodename (Graphmode:integer):string повертає рядок, в якому вказані дозвіл і ім'я режиму: ‘640x200 Vgalo’ (може ще вказати палітру - кількість кольорів)

  • функція Getdrivername : string дозволяє отримати ім'я використовуваного драйвера.

Очищення екрану і перемикання режимів




  1. Процедури очищення екрану:

- Graphdefaults очищає вікно і встановлює параметри (колір фону, пера, палітру, розмір вікна, шрифти) в початкове положення, передбачене модулем Graph.

- Cleardevice очищає екран і встановлює поточний покажчик в положення (0,0).


  1. Перемикання режимів

- Setgraphmode (Graphmode) перемикає систему в графічний режим, вказаний Graphmode і очищає екран монітора.

Такі перемикання можливі тільки в рамках поточного драйвера, інакше необхідно реініціалізувати систему.




  1. Процедура Restorecrtmode повертає систему в текстовий режим, що працює до ініціалізації графіки.

Недолік - подібні перемикання не зберігають зображення на екрані.
Пример:

USES Crt, Graph;

VAR Grd,Grm:integer;

BEGIN


Clrscr;

Writeln(‘Текстовий режим’);

Readln;

Grd := Detect;



InitGraph(Grd, Grm, ’’);

OutTextXY (300,100, ’Графічний режим’);

Readln;

RestoreCRTMode;{ перехід в текстовий режим}



GotoXY (40,13);

Writeln(‘Текстовий режим’);

Readln;

SetGraphMode(GetGraphMode);{ відновлення графічного режиму}



OutTextXY(1,100, ’Графічний режим’);

Readln;


CloseGraph;

END.


База даних захищена авторським правом ©lecture.in.ua 2016
звернутися до адміністрації

    Головна сторінка