Модуль Graph
Модуль Graph представляет собой библиотеку подпрограмм, обеспечивающую полное управление графическими режимами различных адаптеров дисплеев: CGA, EGA, VGA и т.д. Библиотека содержит более пятидесяти графических процедур и функций, как базовых (рисование точек, линий, окружностей и т.п.), так и расширяющих возможности базовых (многоугольники, заполнение фигур, вывод текста и др.).
Чтобы запустить программу, использующую процедуры модуля Graph , необходимо, чтобы в рабочем каталоге находились соответстственно графические драйверы (файлы с расширением .BGI), а если программа использует еще и штриховые шрифты, то необходимо, чтобы там же находились файлы шрифтов (с расширением .CHR).
Кроме того, системе программирования (компилятору) должен быть доступен модуль GRAPH.TPU (он не входит в состав файла TURBO.TPL, а изначально находится в архиве BGI.ARC).
Файлы BGI и содержимое модуля Graph
Файл BGI - это графический интерфейс (Borland Graphic Interface) фирмы Borland. Он обеспечивает взаимодействие программ с графическими устройствами. Перед работой программы в графических режимах дисплея процедура InitGraph определяет тип адаптера, представленного в ПК, и загружает в память соответствующий BGI-драйвер, в котором определены возможные режимы работы.
Процедура CloseGraph выгружает графический драйвер из памяти и восстанавливает текстовый режим работы видеоадаптера. В описываемом модуле присутствуют также процедуры, позволяющие выходить из графического режима без выгрузки драйвера (RestoreCRTMode) и возвращаться обратно (SetGraphMode).
Итак, в рабочем каталоге могут находиться следующие файлы:
CGA.BGI | - драйвер для IBM CGA, MCGA; |
EGAVGA.BGI | - драйвер для IBM EGA, VGA; |
HERC.BGI | - драйвер для Hercules; |
ATT.BGI | - драйвер для АТ&Т6300 (400 строк); |
PC3270.BGI | - драйвер для IBM 3270PC; |
IBM8514.BGI | - драйвер для IBM 8514. |
Такой набор файлов необходим при составлении программ, которые будут работать практически на всех ПК, совместимых с ПК фирмы IBM. Если же такая задача не стоит, то достаточно иметь один файл, соответствующий представленному в используемом ПК графическому адаптеру.
Все процедуры и функции модуля Graph можно разбить на функциональные группы:
1) Управление графическими режимами и их анализ (DetectGraph, InitGraph, CloseGraph, GraphDefaults, ClearDevice, InstallUserDriver, RegisterBGIDriver, RestoreCRTMode, SetGraphMode, SetWrifeMode, GetGraphMode, GetModeRange, GetMaxMode, GetModeName, GetDriverName, GraphResuIt,, GraphErrorMsg).
2) Рисование графических примитивов и фигур:
a) управление «текущим указателем» (MoveTo, MoveRel, GetMaxX, GetMaxY, GetX, GetY);
b) собственно рисование (Line, LineTo, LineRel, Arc, GetArcCoords, Circle, Sector, Ellipse, Rectangle, DrawPoly);
c) стиль линий и коэффициент сжатия изображения (SetLineStyle, GetLineSettings, SetAspeclRatio, GetAspectRatio).
3) Управление цветами и шаблонами заполнения (SetColor, GetColor, SetBkColor, GetBkColor, GetMaxColor, GetPalette, GetPaletteSize, GetDefaultPalette, SetPalette, SetAllPalette, SetRGBPalette, SetFillStyle, SetFillPattern, GetFillPattern, GetFillSettings, SetGraphBufSize, FillPoly, FillEIIipse, FloodFill, PicSlice, Bar, Bar3D).
4) Битовые операции (PutPixel, GetPixel, ImageSize, Getlmage, Putlmage).
5) Управление страницами (SetActivePage, SetVisualPage).
6) Графические окна (вьюпорты) (SetViewPort, GetViewSettings, ClearViewPort).
7) Управление выводом текста (RegisterBGIFont, lnstallUserFont, OutText, OutTextXY, SetTextStyle, SetTextJustify, SetUserCharSize, GetTextSettings, GetTextHeight, TextWidth).
Управление графическими режимами. Инициализация и закрытие графического режима
Процедура инициализации InitGraph. Простейшая программа, использующая графику, обязательно должна содержать блок вызова процедур инициализации графического режима и обращение к процедуре его закрытия. Такой блок инициализирует режим, проверяет правильность переключения и, если все операции прошли успешно, допускает дальнейшую работу программы. Процедура инициализации объявлена следующим образом:
InitGraph (VAR GraphDriver; {тип адаптера}
VAR GraphMode Integer; {режим графики}
DriverPath: String); {путь к драйверу}
В модуле Graph определены константы для задания вида адаптера параметром GraphDriver перед вызовом InitGraph(последняя константа введена для вызова процедуры GetModeRange уже после инициализации).
Detect | = 0; | { автоопределение} |
CGA | = 1; | {адаптер CGA} |
HCGA | = 2; | {адаптер MCGA} |
EGA | = 3; | { адаптер EGA 256K} |
EGA64 | = 4; | { адаптер EGA 64K} |
EGAMono | = 5; | { EGA с моно - дисплеем} |
IBM8514 | = 6; | { адаптер 8514} |
НегсМопо | = 7; | { адаптер Hercules} |
АTT400 | = 8; | { для ПЭВМ AT&T} |
VGA | = 9; | { адаптер VGA} |
РС3270 | = 10; | { адаптер 3270} |
CurrentDriver | =-128; | { для GetModeRange} |
Если параметру GraphDriver присвоить значение константы Detect система включится в режим автоопределсиия. Если возможно переключение системы в графический режим, то инициализируется соответствующий BGI-драйвер и включается режим с максимальным разрешением. В параметрах GraphDriver и GraphMode при этом будут возвращены автоматически выбранные значения или код ошибки.
Такая установка параметров процедуры рекомендуется в тех случаях, когда программа должна работать на разных ПК с различными видеоадаптерами. Однако этот метод предполагает наличие в памяти ПК или на диске одновременно всех драйверов. Если программа большая, то наличие всех драйверов в памяти может вызвать затруднения.
Если же параметр GraphDriver содержит номер конкретного адаптера, то и второй параметр, GraphMode, должен иметь значение (номер) режима, допустимого при этом адаптере.
Все остальные графические установки (положение текущего указателя, палитра, цвет, параметры графического окна и т.д.) при инициализации принимаются по умолчанию.
Параметр DriverPath указывает путь в каталог, содержащий файлы с необходимыми драйверами. Если в него передается значение " (пустая строка), то драйверы должны находиться в текущем каталоге. Это же значение должно передаваться DriverPath, если необходимые BGI-файлы преобразованы при помощи утилиты BINOBJ в файлы типа .OBJ, а затем скомпонованы с программой в ЕХЕ-файл.
Процедура CloseGraph. Для окончательного завершения работы в графическом режиме необходимо всегда производить вызов процедуры CloseGraph. Эта процедура не имеет параметров. Она очищает экран, переводит адаптер в текстовый режим и, если возможно, выгружает из памяти все BGI-драйверы и штриховые шрифты. Последующий возврат в графические режимы возможен только через повторную инициализацию.
Обработка ошибок инициализации
Процедура InitGraph возвращает также и результат своей работы в параметре GraphDriver. В случае ошибки он может принимать значения, приведенные в таблице.
Значение | Объяснение |
-2 | Нет графического адаптера |
-3 | Не найден файл драйвера |
-4 | Ошибка в драйвере (в его коде) |
-5 | Не хватает памяти для загрузки драйвера |
-10 | Невозможный режим для выбранного драйвера |
-15 | Нет такого драйвера |
Если же ошибок при инициализации не обнаружено, то в параметре GraphDriver возвращается номер адаптера из приведенного выше списка констант.
В модуле Graph реализован еще один способ проверки результата проведения графической операции. Он осуществляется с помощью функции
GraphResult: Integer
Эта функция возвращает код результата последнего вызова одной из процедур или функций, указанных в таблице.
Bar Bar3D ClearViewPort CloseGraph DetectGraph DrawPoly FillPoly FloodFill GetGraphMode | ImageSize InitGraph InstallUserDriver InstallUserFont PieStice RegisterBGIdriver RegisterBGIfont SetAllPalette | SetFillPattern SetFillStyle SetGraphBufSize SetGraphMode SetLineStyle SetPalette SetText Justify SetTextStyle |
Таблица кодов, возвращаемых GraphResult, и расшифровка их содержания приведена при описании функции GraphErrorMsg, т.к. обычно эти функции используются совместно. После одного вызова GraphResult следующий ее вызов даст нулевое значение, поэтому для дальнейшего использования результатов тестирования рекомендуется сохранять значение этой функции в какой- либо переменной.
Для быстрой выдачи простого сообщения о типе ошибки графической системы используется функция, преобразующая результат вызова функции GraphResult в сообщение, которое можно вывести процедурой Write. Эта функция объявлена как:
GraphErrorMsg (ErrorCode: Integer): String;
Константы кодов ошибок, определенные в модуле Graph,исоответствующие им сообщения приведены в следующей таблице.
Константа | Код | Сообщение об ошибке | Перевод и пояснение |
grOk | 0 | No error | Ошибки нет |
grNoInitGraph | -1 | (BGI) Graphics not installed (use InitGraph) | Графика не инициализирована |
grNotDetected | -2 | Graphics hardware not detcted | Графический адаптер не найден |
grFileNotFound | -3 | Device driver file not detected | BGI -файла нет в указанном каталоге |
grlnvalidDriver | -4 | Invali device driver file | BGI-файл содержит ошибочный код |
grNoLoadMem | -5 | Not enough memory 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 | Нет места в ОЗУ для загрузки шрифта |
grlnvalidMode | -10 | Invalid Graphics mode for selected driver | Невозможный режим для выбранного драйвера |
grError | -11 | Graphics error | Ошибка графики |
grIOError | -12 | Graphics I/O error | Ошибка ввода-вывода графики |
grInvalidFont | -13 | Invalid font fite | В файле шрифта неправильный код |
grInvalidFontNum | -14 | Invalid font number | Несуществующий номер шрифта |
grInvalidDeviceNum | -15 | Invalid device number | Несуществующий номер адаптера |
Простейший блок инициализации графического режима в программе может выглядеть, как показано в следующем примере.
Uses Graph;
Procedure GrInit;
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;
Begin {Пример инициализации}
GrInit;
Line (0, 0, GetMaxX, GetMaxY);
Readln;
CloseGraph;
End.
В дальнейшем процедуру Grlnit лучше записать в отдельный файл (например, INITGRAF.PAS) и использовать директиву включения этого файла при компиляции. Такой блок всегда включает стандартный графический режим максимального разрешения.
Классификация и анализ графических режимовВозможные графические режимы для различных адаптеров приведены в таблице. Во втором столбце приведены имена предопределенных констант, которые можно передавать в процедуры, управляющие графическими режимами. Последний столбец показывает количество полноэкранных изображений, которые могут храниться в памяти видеоадаптера одновременно.
Драйвер | Имя константы режима и ее значение | Разрешение экрана (в точках) | Палитра | Число видеостраниц |
CGA | CGAC0 = 0 | 320x200 | 4 цвета | 1 |
CGAC1 = 1 | 320x200 | 4 цвета | 1 | |
CGAC2 = 2 | 320x200 | 4 цвета | 1 | |
CGAC3 = 3 | 320x200 | 4 цвета | 1 | |
CGAHi = 4 | 640x200 | 2 цвета | 1 | |
MCGA | MCGAC0 = 0 | 320x200 | 4 цвета | 1 |
MCGAC1 = 1 | 320x200 | 4 цвета | 1 | |
MCGAC2 = 2 | 320x200 | 4 цвета | 1 | |
MCGAC3 = 3 | 320x200 | 4 цвета | 1 | |
MCGAMed= 4 | 640x200 | 2 цвета | 1 | |
MCGAHi = 5 | 640x480 | 2 цвета | 1 | |
EGA | EGALo = 0 | 640x200 | 16 цветов | 4 |
EGAHi = 1 | 640x350 | 16 цветов | 2 | |
EGA64 | EGA64Lo = 0 | 640x200 | 16 цветов | 1 |
EGA64Hi = 1 | 640x350 | 4 цвета | 1 | |
EGAMono | EGAMonoHi = 3 | 640x350 | 2 цвета | 1(2) |
Herc | HercMonoHi = 0 | 720x348 | 2 цвета | 2 |
АТТ | АТТ400С0 = 0 | 320x200 | 4 цвета | 1 |
АТТ400С1 = 1 | 320x200 | 4 цвета | 1 | |
АТТ400С2 = 2 | 320x200 | 4 цвета | 1 | |
АТТ400СЗ = 3 | 320x200 | 4 цвета | 1 | |
ATT400Med = 4 | 640x200 | 2 цвета | 1 | |
АТТ400Нi= 5 | 640x400 | 2 цвета | 1 | |
VGA | VGALo = 0 | 640x200 | 16 цветов | 4 |
VGAMed = 1 | 640x350 | 16 цветов | 2 | |
VGAHi = 2 | 640x480 | 16 цветов | 1 | |
PC3270 | PC3270Hi = 0 | 720x350 | 2 цвета | 1 |
IBM8514 | IBM8514Lo = 0 | 640x480 | 256 цветов | 1 |
IBM8514= 1 | 1024x768 | 256 цветов | 1 |
Для того чтобы полностью использовать возможности установленного в ПК адаптера, необходимо воспользоваться инструкцией по работе с ним.
Процедура DetectGraph. Для тестирования графического адаптера в модуле Graph объявлена процедура:
DetectGraph (VAR GraphDriver, GraphMode: Integer)
Эта процедура может быть вызвана до инициализации графики. Через формальный параметр GraphDriver возвращается значение из первого столбца таблицы указанной выше таблицы, а через параметр GraphMode - обычно последнее значение из соответствующего раздела второго столбца. Эти значения и рекомендуется подставлять в качестве фактических параметров в процедуру InitGraph. После определения GraphDriver автоматически становится доступным диапазон графических режимов, реализуемых адаптером
Существует возможность манипуляции режимами работы графического адаптера - при помощи группы процедур и функций, но уже после инициализации графики. Но часто бывает важным сначала определить разрешенные значения режимов.
Диапазоны графических режимов. Номер текущего графического режима для установленного драйвера определяется функцией
GetGraphMode: Integer,
Функция
GetMaxMode: Word
возвращает номер максимального режима для графического адаптера; таким образом, каждый драйвер поддерживает диапазон режимов 0...GetMaxMode. Обычно этот же результат можно получить из процедуры
GetModeRange (GraphDriver: Integer; VAR LoMode, HiMode: Integer),
через параметры LoMode и HiMode, возвращающей соответственно нижнюю и верхнюю границу режимов для драйвера GraphDriver. Но по ряду технических соображений предпочтительнее пользоваться функцией GetMaxMode, полагая минимальный номер режима равным нулю.
Функции GetModeName и GetDriverName.
GetModeName (GraphMode: Word): String. Функция возвращает строку, в которой содержится последовательно через пробелы разрешение, имя константы и иногда название палитры, например, '640x200 CGA'. Представленный пример поможет определить, в каких графических режимах может работать используемая ПЭВМ.
USES Graph; | {подключен модуль Graph} |
{$I initgraf.pas} | { процедура инициализации} |
VAR | |
mode: Integer; | |
BEGIN | |
Grlnit; | { инициализация} |
for mode := 0 to GetMaxMode do | { показ всех режимов } |
OutTextXY(10, 10+mode*10, GetModeName( mode ) ); | |
ReadLn; | { пауза до нажатия...} |
CloseGraph | { закрытие графики} |
END. |
Функция GetDriverName: String позволяет получить имя используемого драйвера. Ее применение обосновано только в том случае, если в процедуре InitGraph переменная GraphDriver определена, как Detect.
Очистка экрана и переключение режимов
Очистка графического экрана. Две следующие процедуры выполняют почти одинаковые действия, только первая из них является как бы подмножеством второй:
ClearDeviceЭта процедура очищает графический экран и устанавливает указатель позиции в (0, 0), а процедура
GraphDefaults кроме очистки экрана устанавливает ряд параметров графической системы:
o графическое окно становится равным размеру экрана;
o восстанавливается системная цветовая палитра;
o переназначаются цвета основных линий и фона экрана;
o толщина и стиль линий принимаются как по умолчанию;
o цвет и шаблон заливки геометрических фигур и замкнутых ломаных принимается как по умолчанию;
o переустанавливается активный шрифт и его стиль.
Процедура GraphDefaults неявно вызывается при инициализации графики и выполняет, no-сути, все стартовые установки графических параметров.
Переключение режимов. Оно осуществляется процедурой SetGraphMode ( GraphMode: Integer)
Процедура переключает систему в указанный параметром GraphMode режим и очищает экран монитора. При этом все характеристики устанавливаются по умолчанию. Такие переключения возможны только в рамках текущего драйвера.
Процедура RestoreCRTMode. При написании некоторых пакетов, использующих и графические, и текстовые режимы работы, может использоваться процедура RestoreCRTMode, которая возвращает систему в текстовый режим, работавший до инициализации графики. Казалось бы, уже есть процедура с подобным действием — CloseGraph. Однако после нее возврат в графический режим должен проводиться через процедуру InitGraph, что довольно сложно. Если же воспользоваться процедурой RestoreCRTMode, то возвращение в графику будет достаточно простым
USES Graph; | {подключен модуль Graph} | |
{$I Initgraf.pas} | {процедура инициализации} | |
CONST | {константы - сообщения} | |
graph_str = ‘Это графический режим'; | ||
text_str = 'А это текстовый режим'; | ||
graph_ back = 'А это снова графический режим'; | ||
BEGIN | ||
Grlnit; | {инициализация графики} | |
Line(0,0,GetMaxX,GetMaxY }; | { диагональ экрана} | |
OutTextXY(0,100,graph_str); | { вывод первого сообщения} | |
ReadLn; | {пауза до нажатия ввода} | |
RestoreCRTMode; | {восстановление текстового режима} | |
Write{ text_str ); | { вывод второго сообщения} | |
ReadLn; | {пауза до нажатия ввода} | |
SetGraphMode(GetGraphMode); | {восстановление графического режима} | |
Une(0,0,GetMaxX,GetMaxY); | { диагональ экрана } | |
OutTextXY(0,100,graph_back); | {вывод третьего сообщения} | |
ReadLn; | { пауза до нажатия ввода} | |
CloseGraph | { закрытие графики} | |
End. | ||
Обратное переключение осуществляется при помощи функции GetGraphMode, которая возвращает номер текущего графического режима. При работе RestoreCRTMode выгрузки графического драйвера не происходит, т.е. он остается в памяти активным.
Системы координат и «текущий указатель»В растровой компьютерной графике экран представляет собой прямоугольный массив адресуемых точек и любое изображение на нем образуется как композиция светящихся или погашенных пикселов. Эти точки адресуются двумя целыми - горизонтальным номером точки nx и вертикальным номером ny:
... работе в графическом режиме предназначается для обучения студентов младших курсов Санкт-Петербургской государственной Академии аэрокосмического приборостроения навыкам программирования, а именно работе в графическом режиме языка Turbo-Pascal . Для работы с настоящей программой необходимо знание стандарта языка, интегрированной среды и элементарным навыкам работы с персональным компьютером . ...
... Kol := 0; While N <> 0 Do Begin Kol := Kol + 1; N := N Div 10 End; Digits := Kol End; Сохраним этот текст в файле с расширением .inc (это расширение внешних подпрограмм в Turbo Pascal), например, digits.inc. Еще необходима функция возведения натурального числа в натуральную степень. Function Power(A, N : LongInt) : LongInt; {файл power.inc} Var I, St : LongInt; Begin St := ...
... (160,70,'ПАВЛОДАРСКИЙ КОЛЛЕДЖ УПРАВЛЕНИЯ'); outtextxy(170,165,'КУРСОВОЙ ПРОЕКТ ПО ДИСЦИПЛИНЕ: '); outtextxy(110,180,'"ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ"'); outtextxy(150,225,'TEMA: Проектирование баз данных «Справочник покупателя»'); outtextxy(465,345,'Разработал'); outtextxy(465,365,'Запорожец А.С.'); outtextxy(465,385,'Группа П-33); outtextxy(270,410,'2010 год’); Процедура ВВОD ...
... программирования Турбо Паскаль. Диалог между компьютером и играющим осуществляется как в меню, так и во время самой игры. 2. СПЕЦИФИКАЦИЯ ИГРОВОЙ ПРОГРАММЫ «SIEGE» 1. Название задачи Компьютерная игра. Название программы – «Siege». Система программирования Turbo Pascal. 2. Описание Игра начинается с заставки, где написано название игры. Затем следует главное меню, где ...
0 комментариев