Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Графика в Pascal.doc
Скачиваний:
33
Добавлен:
10.06.2015
Размер:
990.21 Кб
Скачать

Переключение между текстовым и графическим режимами.

Работа дисплея невозможна без специальных микросхем, управляющих его работой. Видеоадаптер должен поддерживать работу диплея в графическом режиме. Турбо Паскаль обеспечивает работу со следующими видеоадаптерами: CGA, MCGA,EGA, VGA, Hercules, AT&T 400, 3270 PC, IBM-8514.

Работой видеоадаптера управляет специальная программа, которая называется драйвером. Драйвер хранится в отдельном файле на диске и содержит как исполняемый код, так и необходимые ему для работы данные. Признак файла с драйвером – расширение .bgi имени файла. Имя файла с драйвером соответствует типу видеоадаптера вашего компьютера.

Переключение в графический режим и работа в нем реализованы в Турбо Паскале в виде набора процедур, находящихся в специальном модуле graph.tpu. Работа этого модуля основана на использовании так называемого графического интерфейса Борланд (BGIBorland Graphics Interface), специализированной графической библиотеки. Основное достоинство этого интерфейса заключается в том, что он прост в изучении и вполне подходит для программирования несложных графических программ.

Модуль Graph Турбо Паскаля содержит около пятидесяти различных процедур и функций, предназначенных для работы с графическим экраном. В этом же модуле описаны некоторые встроенные константы и переменные, которые могут быть использованы в графических программах. Основную часть модуля составляют процедуры вывода базовых графических элементов, таких как точки, отрезки прямых линий, дуги и целые окружности и т.д. Такие элементы называются графическими примитивами. Другая группа процедур предназначена для управления графическим режимом.

Модуль Graph должен явно подключаться к программе с помощью оператора использования Uses, записываемого после заголовка программы:

Program Grafics;

Uses Graph;

. . . .

Программа при переключении в графический режим должна определить тип видеоадаптера. Это можно сделать, явно указав в программе тип видеоадаптера или дав программе возможность самостоятельно определить значение соответствующих параметров. Для этого необходимо ввести переменную целого типа, ее идентификатор можно обозначить gd, grdriver, graphdriver. При явном определении видеоадаптера в программе должен присутствовать оператор присваивания:

gd:=value;

где value – это любое некоторое число (см. таблицу ниже), либо встроенная константа (встроенные константы не надо описывать специально, так как их описания содержатся в модулях).

Некоторые возможные значения value приведены в таблице:

Константа

Значение

CGA

MCGA

EGA

EGA64

EGAMono

HercMono

AT&T400

VGA

PC3270

1

2

3

4

5

7

8

9

10

При автоматическом распознавании видеоадаптера в правой части оператора присваивания используется константа Detect (или нулевое значение:

gd:=Detect; gd:=0.

Второе, что должна сделать программа – задать определенный графический режим. Большинство видеоадаптеров могут работать в нескольких графических режимах. Эти режимы различаются прежде всего разрешением и набором доступных цветов. Для этого следует ввести еще одну переменную целого типа, назовем ее gm или grmode, или GraphMode. Некоторые допустимые значения приведены в таблице:

Константа

Значение

Описание графического режима

EGALo

0

640x200, 16 цветов, 4 страницы

EGAHi

1

640x350, 16 цветов, 2 страницы

EGA64Lo

0

640x200, 16 цветов, 1 страница

EGA64Hi

1

640x350, 4 цвета, 1 страница

VGALo

0

640x200, 16 цветов, 4 страницы

VGAMed

1

640x350, 16 цветов, 2 страницы

VGAHi

2

640х480, 16 цветов, 1 страница

VGAHi2

3

640х480, 2 цвета, 1 страница

В столбце "описание графического режима" приведены разрешение, количество цветов и количество страниц видеопамяти. Последний параметр связан с тем, что графическое изображение формируется в специальной видеопамяти. Можно считать, что видеопамять состоит из набора областей – страниц. Изображение формируется на отдельной странице. Страничную организацию видеопамяти можно использовать для программирования динамических изображений.

Переключение в графический режим работы дисплея выполняется вызовом процедуры InitGraph из модуля Graph.

Описание:

InitGraph(var gd:Integer; var gm:Integer;

путь_драйвер:string)

Первый параметр в этой процедуре задает тип видеоадаптера, второй определяет режим. И параметр gd, и параметр gm являются параметрами-переменными (var). Параметр "путь_драйвер" определяет путь доступа к каталогу (маршрут), в котором находятся графические драйверы. Если этот параметр пуст, то подразумевается, что файлы драйверов содержатся в текущем каталоге.

Процедура InitGraph инициализирует графическую систему и переводит аппаратуру в графический режим.

Примеры:

Program Grafics; Program Grafics;

Uses graph; Uses graph;

Var gd,gm:Integer; Var gd,gm:Integer;

Begin Begin

gd:=9; gm:=1; gd:=vga; gm:=VGALo;

InitGraph(gd,gm,' '); InitGraph(gd,gm,'c:\tp\bgi')

. . . . . . . . . .

Переключение в графический режим (инициализация графического режима) обычно сопровождается обработкой возможных ошибок инициализации. Эти ошибки могут быть связаны с отсутствием графического драйвера или неправильными значениями параметров. При наличии ошибки процедура InitGraph вырабатывает соответствующий, отличный от нуля, результат – код ошибки. Этот код можно получить с помощью функции GraphResult.

Описание:

GraphResult Тип результата: Целый (Integer).

Определены следующие коды ошибок:

- 1 графика не установлена (используйте процедуру InitGraph);

- 2 графическая аппаратура не найдена;

- 3 драйвер графического устройства не найден;

- 4 неверный файл драйвера графического устройства;

- 5 не хватает памяти для загрузки драйвера;

- 6 выход за границы при просмотре области закраски;

- 7 выход за границы памяти при закрашивании;

- 8 файл шрифта не найден;

- 9 не хватает памяти для загрузки шрифта;

- 10 недопустимый графический режим для выбранного драйвера.

Завершение работы в графическом режиме производится с помощью процедуры CloseGraph, которая выгружает драйвер из памяти и восстанавливает предыдущий видеорежим.

Для перевода системы в графический режим с учетом выше изложенного давайте запишем процедуру и будем использовать ее для написания программ, так как не очень-то удобно каждый раз записывать в программе целый набор операторов инициализации.

Procedure Graphinterface;

Var

driver, mode, error:Integer;

s:String;

Begin

driver:=detect;

s:=' ';

Initgraph(driver,mode,s);

error:=GraphResult;

if error<>GrOk then

begin

writeln(GraphErrorMsg(Error));

Halt(error)

end

end;

В данной процедуре driver – переменная целого типа для определения типа видеоадаптера (здесь производится автоматическое распознавание видеоадаптера); mode – переменная целого типа для определения графического режима (явных указаний о графическом режиме в данной процедуре нет, поэтому значение принимается по умолчанию, вы можете записать любой графический режим из представленной таблицы); error – переменная целого типа для определения кода ошибки; s – строковая переменная для определения расположения драйвера на диске (пустая строка означает, что графический драйвер находится в том же каталоге, что и программа). При обнаружении процедурой

GraphResult ошибки инициализации (смотрите условный оператор) на экран выводится сообщение об ошибке для заданного кода (смотрите строку writeln(GraphErrorMsg(Error)). Функция GraphErrorMsg возвращает строку сообщения об ошибке для заданного кода. И последняя процедура Halt – стандартная процедура, которая завершает выполнение программы и выполняет возврат в операционную систему.

Для установки графического режима используются еще несколько процедур и функций.

Процедура DetectGraph.

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

Описание:

DetectGraph (var драйвер, режим: Integer).

Примечания: процедура возвращает значения выбранного режима и драйвера, которые можно передать в качестве параметров процедуре InitGraph для загрузки соответствующего драйвера (смотрите таблицу выше). Если не указываются другие действия (или параметр графического драйвера равняется Detect (0)), процедура InitGraph вызывает процедуру DetectGraph, находит и загружает соответствующий драйвер и инициализирует графическую систему. Единственной причиной непосредственного вызова процедуры DetectGraph является замена выбираемого ей драйвера.

Функция SetGraphMode

Устанавливает для системы графический режим и очищает экран.

Описание: SetGraphMode (режим: Integer)

Значение режима представляет собой целое число в диапазоне от 0 до 5 и зависит от текущего драйвера (смотрите таблицу графических режимов).

Процедура GetGraphMode

Данная процедура возвращает текущий графический режим, установленный с помощью процедур InitGraph и SetGraphMode. Значения режима представляют собой целое число от 0 до 5 (смотрите таблицу графических режимов).

Процедура GraphDefaults

Сбрасывает установленные для графических средств параметры и устанавливает для графической системы параметры:

- область просмотра;

- палитру;

- фоновый и основной цвет;

- тип линии и образец линии;

- тип заполнителя, образец заполнителя и цвет заполнителя.

Процедура GetModeRange

Для данного драйвера возвращает наименьший и наибольший графический режим.

Описание:

GetModeRange(GraphDriver: Integer;

var LoMode, HiMode: Integer)

Здесь LoMode – наименьший (Lowest), HiMode – наибольший (Highest) режимы данного драйвера. Если значение GraphDriver является недопустимым, то возвращаемый параметр будет равен – 1.

Функция GetModeName

Возвращает строку, содержащую имя заданного графического режима.

Описание:

GetModeName(номер режима:Integer)

Тип результата: строковый (string).

Имена режимов встроены в каждый драйвер. Возвращаемые значения можно использовать для создания меню, вывода режимов экрана и т.д.

Процедура RestoreCrtMode

Перезагружает первоначальный экранный режим перед инициализацией графики.

Эта процедура и процедура SetGraphMode позволяют переключаться между текстовым и графическим режимами, не закрывая графический режим.

Пример

Program Examp_1;

Uses Graph;

Var

driver, mode, error:Integer;

s:String;

Begin

driver:=detect;

s:=' ';

Initgraph(driver,mode,s);

error:=GraphResult;

if error<>GrOk then

begin

writeln(GraphErrorMsg(Error));

Halt(error)

end;

OutText('Графический режим.

Нажмите <Ввод>');

Readln;

RestoreCrtMode;

Write('Теперь текстовый. Нажмите <Ввод>');

Readln;

SetGraphMode(mode);

OutText('Снова графический режим.

Нажмите <Ввод>');

Readln;

CloseGraph; {завершение работы в

графическом режиме}

end. {GraphTest}