Графический режим монитора
Для создания графических изображений, то есть для работы монитора в графическом режиме, предназначен модуль GRAPH, хранящийся в соответствующем файле.
В настоящее время используются самые разнообразные видеоадаптеры, поддерживающие несколько режимов работы монитора, стандартными из которых считаются:
VGA (Video Graphics Array) с максимальным разрешением 640х480 точек (пикселов);
SVGA (Super VGA) – 800x600;
XGA (eXtended Graphics Array) – 1024x768:
SXGA (Super XGA) – 1280x1024;
UXGA (Ultra XGA) – 1600x1200 и другие.
Более того, в каждом режиме можно отображать разное количество цветов, что существенно зависит от объема видеопамяти. При работе с 16-ю цветами каждая точка занимает полбайта, с 256 – 1 байт, в режиме High Color (более 65 тыс. цветов) – 2 байта, в режиме True Color (более 16 млн. цветов) – 3 байта.
В модуле Graph поддерживается только режим VGA. Здесь можно задавать всего 16 цветов, но три варианта точек по вертикали: 200, 350 и 480, которые задаются режимами: VGALo=0, VGAMed=1, VGAHi=2. Для управления режимом VGA необходимо подключать специальный драйвер, находящийся в файле EGAVGA.BGI (Borland Graphic Interface).
Если программа запускается из DOS, то графический режим надо инициализировать, задав драйвер и его режим в процедуре инициализации:
InitGraph (< драйвер >,< режим >,< путь к драйверу >);
например:
D:=VGA;
R:=VGAHi;
InitGraph (D,R,’’);
Аналогично для восстановления текстового режима используется процедура
CloseGraph;
Удобнее автоматически распознавать используемый адаптер процедурой
DetectGraph (<драйвер>,<режим>);
например
DetectGraph (D,R);
InitGraph (D,R,’’);
В графическом режиме курсор отсутствует. Его функции выполняет невидимый текущий указатель CP (Current Pointer), выполняющий аналогичные функции. Для его перемещения используется процедура
MoveTo (X,Y:Integer);
причем Х для режима Hi может изменяться в диапазоне от 1 до 640, а Y – от 1 до 480.
Для перемещения указателя относительно его последнего положения используется процедура
MoveRel (dX,dY:Integer);
Аналогично текстовому режиму, здесь используется цвет переднего плана и цвет фона, которые устанавливаются процедурами
SetColor (Color:Word);
SetBkColor (Color:Word);
Дополнительно используется процедура заливки для закрашивания фигур и замкнутых областей
SetFillStyle (Pattern:Word; Color:Word);
где Pattern определяет стиль заполнения.
Модуль включает множество простейших процедур рисования: отображение точки, прямой, прямоугольников, окружностей и т.п. Для вывода текста используются специальные процедуры.
Пример построения столбцовой диаграммы двух функций.
Program Diagram;
{ Демонстрационный пример на использование модуля Graph: столбцовая диаграмма функций F1 и F2 }
Uses Crt,Graph;
Const
xmin:real=0.05; { Начальные значения аргумента }
xmax:real=1;
step:real=0.05;
Var x, { текущее значение аргумента }
Fmin,Fmax:real;
stdiag, { ширина большого прямоугольника }
xdiag, { текущая точка диаграммы }
rezim,razm:integer; { режим и разрешение монитора }
stng:string; { временная переменная для преобразования числовых данных при выводе }
Function F1(x:real):real;
Begin
F1:=exp(-x)*sin(x)
end;
Function F2(x:real):real;
Begin
F2:=exp(-sqrt(x))*cos(x);
end;
Begin
{ Поиск экстремумов функции }
x:=xmin;
Fmin:=F1(x);
Fmax:=Fmin;
Repeat
if F1(x)>Fmax then Fmax:=F1(x);
if F2(x)>Fmax then Fmax:=F2(x);
if F1(x)<Fmin then Fmin:=F1(x);
if F2(x)<Fmin then Fmin:=F2(x);
x:=x+step;
until x>xmax;
{ Контроль за масштабом шкалы ординат }
Writeln('min=',Fmin:8:5,' max=',Fmax:8:5);
Read(Fmin,Fmax);
{ Установка графического режима и цветов }
DetectGraph(rezim,razm);
InitGraph(rezim,razm,'');
SetBkColor(Black);
SetColor(White);
{ Заголовок диаграммы }
OutTextXY(220,20,'Диаграмма двух функций');
{ Координатные линии }
Line(44,50,44,451);
Line(44,451,595,451);
{ Масштабы по X и Y - числовые значения }
Str(xmin:4:2,stng);
OutTextXY(44,460,stng);
Str(xmax:4:2,stng);
OutTextXY(570,460,stng);
Str(Fmax:4:2,stng);
OutTextXY(1,50,stng);
Str(Fmin:4:2,stng);
OutTextXY(1,445,stng);
{ Определение расстояния между столбцами }
stdiag:=round(500/((xmax-xmin)/step));
x:=xmin;
xdiag:=45;
{ Вывод в цикле по два столбца }
Repeat
{ F1 - широкий и зеленый столбец }
SetFillStyle(SolidFill,Green);
Bar(xdiag,450,xdiag+stdiag-2,round(450-400*(F1(x)-Fmin)/(Fmax-Fmin)));
{ F2 - красный и узкий столбец }
SetFillStyle(SolidFill,Red);
Bar(xdiag+round(stdiag/4),450,
xdiag+round(stdiag/4*3)-2,round(450-400*(F2(x)-Fmin)/(Fmax-Fmin)));
x:=x+step;
xdiag:=xdiag+stdiag;
until x>xmax;
{ Индицируем результат, пока не будет нажата какая либо клавиша }
Repeat
until KeyPressed;
{ Выход из графического режима }
CloseGraph
end.
Контрольные вопросы
1. Что такое «модуль»?
2. Что такое «ресурсы модуля»?
3. Чем отличается программа от модуля?
4. Что находится в интерфейсе модуля?
5. Что находится в реализации модуля?
6. Для чего предназначен и когда выполняется раздел инициализации модуля?
7. Какова общая структура модуля?
8. Как выглядят заголовки подпрограмм в интерфейсной части и в разделе реализации?
9. Как выполняется подключение модулей к программе?
10. Как получить доступ к именам модулей при их совпадении?
11. Что такое «косвенное использование модулей»?
12. Может ли модуль обращаться сам к себе (рекурсивное обращение)?
13. Что необходимо предпринять, если имя модуля и имя содержащего его файла не совпадают?
14. В каком файле находятся стандартные используемые модули?
15. Какие 5 модулей находятся в стандартном библиотечном файле?
16. Что находится в модуле System, и как он подключается к программе?
17. Что содержит модуль Crt?
18. Что содержит модуль Dos?
19. Какую информацию содержит байт атрибута символа в текстовом режиме монитора?
20. Сколько цветов можно использовать для символа, и сколько для фона при наличии одного байта атрибута символа?
21. В каких местах экрана расположена начальная и конечная координата символов?
22. Какая процедура используется для очистки экрана?
23. Какая процедура используется для перемещения курсора в заданную точку?
24. С помощью каких функций можно узнать местоположение курсора?
25. С помощью какой функции можно изменить цвет дальнейших выводимых символов?
26. С помощью какой функции можно изменить цвет дальнейших выводимых знакомест (фона символов)?
27. Какая функция предназначена для считывания одного символа с клавиатуры?
28. Какая функция предназначена для определения нажатия клавиши?
29. Что такое «стандартный звуковой сигнал»?
30. Какую процедуру используют для включения звука с заданной частотой?
31. Какую процедуру используют для выключения звука?
32. Какую процедуру используют для выполнения задержки по времени?
33. В каких целях используются ресурсы модуля DOS?
34. Какая процедура используется для поиска первого файла с заданным именем?
35. Какая процедура используется для поиска следующего файла, после найденного первого?
36. Какая процедура используется для распаковки данных о времени создания файла?
37. Какая процедура используется для поиска файла в разных каталогах?
38. Какой процедурой из составного имени файла выделяют отдельно путь, имя и расширение файла?
39. С помощью какой процедуры можно определить размер логического устройства (диска)?
40. С помощью какой процедуры можно определить количество свободного места (в байтах) на логическом устройстве (диске)?
41. С помощью какой процедуры можно определить системную дату?
42. С помощью какой процедуры можно определить системное время?
43. С помощью какой процедуры можно установить системную дату?
44. С помощью какой процедуры можно установить системное время?
45. Какая стандартная процедура модуля DOS используется для общего вызова прерывания?
46. Какая стандартная процедура модуля DOS используется для вызова часто используемого прерывания DOS 21H?
47. Какой стандартный режим монитора поддерживает модуль Graph?
48. Какой процедурой инициализируется графический режим монитора?
49. Какой процедурой инициализируется текстовый режим монитора?
50. Какая процедура используется для перемещения графического (текущего) указателя в абсолютных координатах?
51. Какая процедура используется для перемещения графического (текущего) указателя в относительных координатах?
52. Какая процедура используется для установки цвета переднего плана в графическом режиме?
53. Какая процедура используется для установки цвета фона в графическом режиме?
54. Какой вид имеет процедура заливки для закрашивания фигур и замкнутых областей?
Дата добавления: 2016-06-29; просмотров: 2085;