ТР обладает достаточно разнообразными
средствами для работы со стандартным VGA экраном (возможно
также использование и и других типов видеоадаптеров).
VGA адаптер имеет разрешение 640х480
пиксел (точка (0,0) в левом верхнем углу экрана), 16
цветов.
Перед началом работы с графикой
необходимо ее инициализировать, а по окончании - "закрыть".
Все графические процедуры и функции находятся в модуле
Graph, поэтому также необходимо его подключение.
Общая структура графической программы:
Uses crt, graph;
var Gd, Gm: Integer;
begin
Gd := Detect;
InitGraph(Gd, Gm, 'c:\bp\bgi');
...
{Здесь построение изображения}
...
ReadKey;
CloseGraph;
end.
Путь c:\bp\bgi указывает расположение
файла egavga.bgi (драйвер графического адаптера). На
разный компьютерах этот путь может быть разным. Если
файл egavga.bgi поместить в каталог с программой, то
путь можно не указывать.
Основные графические процедуры и
функции:
Построение фигур
PutPixel(x,y,c)
- отображает на экране точку с координатами (x,y) и
цветом c
Line(x1,y1,x2,y2)
- рисует линию с началом в точке (x1,y1) и концом -
(x2,y2)
Rectangle(x1,y1,x2,y2)
- рисует контур прямоугольника с диагональю (x1,y1) -
(x2,y2)
Bar(x1,y1,x2,y2)
- рисует закрашенный прямоугольник с диагональю (x1,y1)
- (x2,y2)
Circle(x,y,r)
- рисует окружность с центром (x,y) и радиусом r
Ellipse(x,y,ba,ea,xr,yr)
- рисует дугу эллипса с центром в (x,y), горизонтальным
и вертикальным радиусом xr и yr, и начальным и конечным
углом ba и ea
FillEllipse(x,y,xr,yr)
- рисует закрашенный эллипс с центром в (x,y),
горизонтальным и вертикальным радиусом xr и yr
Определение цветов и стилей
GetPixel(x,y)
- возвращает цвет пиксела с координатами (x,y)
SetColor(c)
- устанавливает цвет изображения (для линий)
SetFillStyle(p,c)
- устанавливает текущий стиль p и цвет c (для "закрашенных"
фигур)
FloodFill(x,y,b)
- закрашивает замкнутую область с внутренней точкой (x,y)
и цветом контура b
Работа с текстом
OutTextXY(x,y,st)
- выводит на экран строку st с позиции (x,y)
SetTextStyle(f,d,s)
- устанавливает шрифт f, его направление d и размер
Сообщения об ошибках
function GraphErrorMsg(ErrorCode : integer) : String;
Возвращает строку сообщения об ошибке для заданного кода
ErrorCode.
function GraphResult : integer;
Возвращает код ошибки для последней графической
операции.
Определение адаптера,
инициализация и переход между текстом и графикой
procedure DetectGraph(var GraphDriver, GraphMode:
integer);
Проверяет аппаратуру и определяет какой графический
драйвер и в каком режиме используется (тип адаптера - в
GraphDriver, режим - GraphMode).
function GetDriverName : string;
Вoзвращает строку с именем текущего драйвера.
procedure InitGraph(var GraphDriver : integer;
var GraphMode : integer;
PathToDriver : String);
Инициализирует графическую систему и устанавливает
устройство в графический режим. PathToDriver -
полный путь к драйверу .bgi, обычно 'c:\tp\bgi'.
Если путь опущен (''), то драйвер должен находится в
текущем каталоге.
function RegisterBGIfont(Font : pointer) : integer;
Регистрирует шрифт BGI для графической системы.
Зарегистрированный фонт может использоваться в вызове
SetTextStyle. Он может быть загружен с диска в кучу
или преобразован в .obj файл (с помощью binobj.exe) и
связан в файл .exe. В случае ошибки функция возвращает
отрицательное значение.
function RegisterBGIdriver(Driver : pointer) :
integer;
Регистрирует драйвер BGI для графической системы.
Зарегистрированный драйвер будет использоваться
процедурой InitGraph. Он может быть загружен с
диска в кучу или преобразован в .obj файл (с помощью
binobj.exe) и связан в файл .exe. В случае ошибки
функция возвращает отрицательное значение.
function InstallUserDriver(DriverFileName : string;
AutoDetectPtr : pointer) : integer;
Устанавливает пользовательский драйвер устройства в BGI
таблицу драйверов устройств.
function InstallUserFont(FontFileName : string) :
integer;
Устанавливает новый шрифт, который не встроен в BGI
систему.
procedure SetGraphBufSize(BufSize : word);
Позволяет изменить размер буфера для функций заполнения
(закрасок). Буфер с размером BufSize байт размещается в
куче при обращении к InitGraph. По умолчанию размер 4К,
что достаточно для построения многоугольника с 650
линиями.
function GetMaxMode : integer;
Возвращает номер максимального режима текущего
загруженного драйвера.
procedure GetModeRange(GraphDriver : integer; var
LoMode, HiMode : integer);
Возвращает минимальный и максимальный графические режимы
для данного драйвера.
function GetModeName(GraphMode : integer) : string;
Возвращает строку с именем указанного графического
режима.
procedure SetGraphMode(Mode : integer);
Переводит систему в указанный графический режим и
очищает экран.
function GetGraphMode : integer;
Возвращает текущий графический режим.
procedure GraphDefaults;
Устанавливает текущий указатель (CP) в исходную позицию
(т.е. точку 0,0) и сбрасывает все устанавливаемые
пользователем режимы в исходное состояние, в т.ч. окна,
палитру, основной цвет и цвет фона, стиль линий, шрифт,
выравнивание текста, размер символов и стиль выводимого
текста. Система должна находиться в графическом режиме.
procedure RestoreCrtMode;
Восстанавливает текстовый видеорежим, который был до
инициализации графики. Не освобождает буфер и не
обнуляет установленные переменные.
procedure CloseGraph;
Закрывает графическую систему. Восстанавливает текстовый
видеорежим, который был до инициализации графики.
Освобождает буфер и сбрасывает все графические
переменные.
Координаты
графического курсора
function GetX : integer;
Возвращает координату X текущей позиции (CP).
function GetY : integer;
Возвращает координату Y текущей позиции (СР).
function GetMaxX : integer;
Возврашает максимальный Х (разрешение по горизонтали)
для текущего графического драйвера и режима.
function GetMaxY : integer;
Возвращает максимальный Y (разрешение по вертикали) для
текущего графического драйвера и режима.
Работа с экраном,
окнами и страницами
procedure ClearDevice;
Очищает экран и устанавливает текущий указатель (CP) в
начало.
procedure SetViewPort(x1, y1, x2, y2 : integer; Clip
: boolean);
Устанавливает текущее окно для графического вывода. Если
Clip = ClipOn (true), то изображения, не
вмещающиеся в границы, будут отсекаться, если ClipOff
(false) - не будут.
procedure GetViewSettings(var ViewPort :
ViewPortType);
Возвращает запись, содержащую параметры окна и
отсечения.
procedure ClearViewPort;
Очищает текущее окно.
procedure SetVisualPage(Page : word);
Устанавливает видимой страницу с номером Page
(нумерация страниц начинается с нуля).
procedure SetActivePage(Page : word);
Устанавливает активную страницу для графического вывода.
Страница при этом может быть невидимой.
Точки
procedure PutPixel(X, Y : integer; Pixel : word);
Рисует точку (пиксел) с координатами (X,Y) цветом
Pixel.
function GetPixel(X, Y : integer) : word;
Возвращает цвет точки с координатами (X,Y).
Линии и перемещение
текущего указателя
procedure SetWriteMode(WriteMode : integer);
Устанавливает режим вывода (копирование или исключающее
или) для линий, рисуемых с DrawPoly, Line, LineRel,
LineTo, Rectangle.
procedure LineTo(X, Y : integer);
Рисует линию от текущего указателя к точке с
координатами (X,Y).
procedure LineRel(Dx, Dy : integer);
Рисует линию от текущего указателя (CP) к точке, лежащей
на заданном растоянии от него.
procedure MoveTo(X, Y : integer);
Передвигает текущий указатель (CP) в (X,Y).
procedure MoveRel(Dx, Dy : integer);
Передвигает текущий указатель (CP) на заданное
расстояние от его текущей позиции.
procedure Line(x1, y1, x2, y2 : integer);
Рисует линию от (X1,Y1) к (X2,Y2).
procedure GetLineSettings(var LineInfo :
LineSettingsType);
Возвращает текущие стиль, шаблон и толщину линии,
установленные SetLineStyle.
procedure SetLineStyle(LineStyle : word; Pattern :
word; Thickness : word);
Устанавливает текущие стиль, шаблон и толщину линии (см.
соответствующие таблицы констант выше).
Многоугольники,
заполнения и фигуры
procedure Rectangle(x1, y1, x2, y2 : integer);
Рисует прямоугольник с заданными координатами без
заполнения (т.е. рамку), используя текущий цвет и тип
линии.
procedure Bar(x1, y1, x2, y2 : integer);
Рисует прямоугольник с заданными координатами, используя
текущий цвет и тип линии и заполняет его текущим стилем.
procedure Bar3D(x1, y1, x2, y2 : integer; Depth :
word; Top : boolean);
Рисует параллелепипед с координатами передней грани (x1,
y1, x2, y2) и глубиной Depth, используя текущий стиль и
цвет и заполняет его текущим стилем. Если Top = TopOn
(true), то верхняя грань рисуется, если TopOff
(false), то нет.
procedure DrawPoly(NumPoints : word; var PolyPoints);
Рисует многоугольник (ломаную) текущим цветом и типом
линии. Ломаная задается числом вершин в параметре
NumPoints и координатами вершин в массиве
PolyPoints. Элементами массива являются записи типа
PointType.
procedure FillPoly(NumPoints : word; var PolyPoints);
Рисует и заполняет многоугольник текущим типом закраски.
Задание вершин аналогично DrawPoly.
procedure GetFillSettings (var FillInfo:
FillSettingsType);
Позволяет запросить текущий шаблон и цвет, установленные
SetFillStyle или SetFillPattern.
procedure GetFillPattern(var FillPattern:
FillPatternType);
Возвращает шаблон заполнения, установленный последним
вызовом SetFillPattern. Если ранее в программе
нет обращений к SetFillPattern, то будет
возвращен массив, состоящий из $FF.
procedure SetFillStyle(Pattern : word; Color : word);
Устанавливает шаблон и цвет заполнения, где Pattern
- один из стандартных шаблонов, Color - цвет.
procedure SetFillPattern(Pattern : FillPatternType;
Color : word);
Устанавливает шаблон заполнения, определенный
пользователем.
procedure FloodFill(X, Y : integer; Border : word);
Заполняет ограниченную область, используя текущий шаблон
и цвет заполнения. Закрашивается область, внутри которой
находится точка с координатами (X,Y). Border -
цвет границы области.
Дуги, окружности и
другие кривые
procedure Arc(X, Y : integer; StAngle, EndAngle,
Radius: word);
Рисует дугу с радиусом Radius от начального угла
StAngle к конечному EndAngle, используя
(X,Y) как центр. Углы измеряются в градусах против
часовой стрелки. Используется текущий цвет и стиль
линий.
procedure GetArcCoords(var ArcCoords :
ArcCoordsType);
Получает координаты последней выведенной дуги процедурой
Arc.
procedure Circle(X, Y : integer; Radius : word);
Рисует окружность с центром в точке (X,Y) и радиусом
Radius.
procedure Ellipse(X, Y : integer; StAngle, EndAngle :
word;
XRadius, YRadius : word);
Рисует эллиптическую дугу с центром в точке (X,Y) от
начального угла StAngle к конечному EndAngle
с радиусами XRAdius и YRadius (горизонтальные и
вертикальные оси).
procedure FillEllipse(X, Y : integer; XRadius,
YRadius: word);
Рисует и заполняет эллипс с полуосями XRadius и
YRadius, используя (X,Y) как центр.
procedure GetAspectRatio(var Xasp, Yasp : word);
Возвращает два числа XAsp и YAsp, которые
указывают как одинаковые по количеству пикселов длины
сторон X и Y относятся друг к другу. Это позволяет
вычислить относительный аспект разрешения экрана XAsp
/ YAsp. Используется при выводе правильных квадратов
и окружностей.
procedure SetAspectRatio(Xasp, Yasp : word);
Изменяет значение относительного аспекта.
procedure PieSlice(X, Y : integer; StAngle, EndAngle,
Radius : word);
Рисует и заполняет сектор круга с центром в точке
(X,Y, радиусом Radius от начального угла
StAngle к конечному EndAngle.
procedure Sector(X, Y : Integer; StAngle, EndAngle,
XRadius, YRadius : word);
Рисует и заполняет сектор эллипса с центром в точке
(X,Y), полуосями XRadius и YRadius от
начального угла StAngle к конечному EndAngle.
Цвет и палитра
procedure SetBkColor(Color : word);
Устанавливает цвет фона.
procedure SetColor(Color : word);
Устанавливает основной цвет, которым будет
осуществляться рисование.
function GetBkColor : word;
Возвращает текущий фоновый цвет.
function GetColor : word;
Возвращает текущий основной цвет.
procedure SetAllPalette(var Palette);
Устанавливает все цвета палитры. Переменная Palette
должна быть типа PaletteType.
procedure SetPalette(ColorNum : word; Color :
shortint;
Изменяет один цвет палитры, указанный через ColorNum
и Color.
procedure GetPalette(var Palette : PaletteType);
Возвращает текущую палитру в переменной Palette.
function GetPaletteSize : integer;
Возвращает размер таблицы палитры.
procedure GetDefaultPalette(var Palette : PaletteType);
Возвращает аппаратную палитру в записи PaletteTyp.
function GetMaxColor : word;
Возвращает максимальный цвет, который можно задать в
SetColor.
procedure SetRGBPalette(ColorNum, RedValue,
GreenValue, BlueValue : integer);
Позволяет модифицировать один из цветов палитры для IBM
8514 и VGA по насыщенности красного, зеленого и голубого
цветов.
Сохранение и выдача
изображений
function ImageSize(x1, y1, x2, y2 : integer) : word;
Возвращает число байт, требуемое для сохранения
прямоугольной области экрана.
procedure GetImage(x1, y1, x2, y2 : integer; var
BitMap);
Сохраняет битовый образ указанной прямоугольной части
экрана в буфере BitMap.
procedure PutImage(X, Y : integer; var BitMap; BitBlt
: word);
Выводит битовый образ BitMap на экран в виде
прямоугольника с координатами верхнего левого угла в
точке (X,Y). BitBlt - вид наложения образа (и, или,
ислючающее или и т.д. - см. таблицу битовых операторов
выше).
Работа со строками
procedure GetTextSettings(var TextInfo :
TextSettingsType);
Возвращает текущий шрифт, направление, размер и
выравнивание текста, установленные SetTextStyle и
SetTextJustify.
procedure OutText(TextString : string);
Выводит текст на экран, начиная от текущего указателя
(CP), используя текущий цвет, шрифт и выравнивание.
procedure OutTextXY(X, Y : integer; TextString :
string);
Выводит текст на экран, начиная от точки (X,Y).
procedure SetTextJustify(Horiz, Vert : word);
Устанавливает горизонтальное и вертикальное выравнивание
текста, используемое OutText и OutTextXY.
procedure SetTextStyle(Font, Direction : word;
CharSize : word);
Устанавливает текущий шрифт Font, направление
Direction (горизонтальное или вертикальное) и размер
CharSize текста (от 0 до 30).
procedure SetUserCharSize(MultX, DivX, MultY, DivY :
word);
Позволяет изменить ширину и высоту символа для
штрихового (векторного) шрифта (Gothic, SanSerif,
Small, Triplex).
function TextHeight(TextString : string) : word;
Возвращает высоту строки в пикселах, если она будет
выводиться текущим шрифтом.
function TextWidth(TextString : string) : word;
Возвращает ширину строки в пикселах.
ОТЛИЧИЯ ГРАФИКИ
ТУРБО-ПАСКАЛЯ и ТУРБО-СИ
Турбо-Паскаль не различает отличий в регистрах (маленькие
или большие буквы) при написании констант, типов,
процедур и функций модуля Graph.
В Турбо-Си все константы, типы, переменные должны
быть в верхнем регистре (заглавными буквами), а названия
процедур и функций - в нижнем (прописными буквами).
Содержание библиотек графики при этом абсолютно
одинаково.
НЕДОСТАТКИ BGI-ГРАФИКИ
Несмотря на обширные возможности для деловой графики,
графические средства с точки зрения профессионального
разработчика оставляют желать лучшего. Нельзя работать с
произвольными спрайтами, нет скроллинга экрана,
сохранения / вывода всего изображения, масштабирования
картинки, функции заполнения и работы с битовыми
образами работают медленно, невозможно использование
файлов других графических форматов, отсутствуют
трехмерные изображения и т.д.
Все это делает затруднительным написание графических
редакторов, игрушек, систем инженерной и математической
графики.
Для реализации вышеуказанных возможностей необходимо
напрямую управлять графическим адаптером, используя
прямой доступ в видеопамять и служебные функции BIOS.