Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабораторные на Pasca (Кудрявцев)l

.pdf
Скачиваний:
32
Добавлен:
18.03.2015
Размер:
1.63 Mб
Скачать

223

Лабораторная работа № 20

УПРАВЛЕНИЕ ВИДЕОСТРАНИЦАМИ. ГРАФИЧЕСКИЕ ОКНА. ВЫВОД ТЕКСТА

Управление видеостраницами. Память видеоадаптеров разделена на так называемые страницы, или видеостраницы. По умолчанию в графическом режиме действия производятся с нулевой страницей. Однако, если направить вывод изображений на ненулевую страни- цу (при условии, что такая доступна в текущем режиме видеоадап- тера), то на экране ничего не отобразится, поскольку по умолчанию видимой является нулевая страница. Если же после этого дать ко- манду считать видимой скрытуюстраницу, то она появится на экране буквально мгновенно. Проделать все это позволяют две процедуры:

SetVisualPage(Page: Word),

которая устанавливает видимойна экране видеостраницу номер Page, и процедура

SetActivePage(Page: Word),

устанавливающая перенаправление всех графических операций на страницу номер Page (т.е. делающая активной). Обратите внима- ние, что активность не тождественна видимости страницы на экра- не.

Рассмотрим типичный пример использования этих процедур.

Uses Graph, Crt;

{используются Graph и Crt}

{ $I initgraph.pas }

{инициализация графики}

Procedure Forms (kadr: Byte);

{рисование кадров 0..1}

Const

{радиусы эллипсов в кадрах}

Radius: Array [0..3] of integer = (20, 40, 60,

80);

 

Var

 

r, rr: Integer;

 

Begin

{максимальный радиус}

r:= Radius [kadr];

rr:= 0;

{радиус вложенного эллипса}

Repeat

 

Ellipse (GetMaxX div 2, GetMaxY div 2, 0,

 

224

Лабораторная работа № 20

 

 

360, r, rr); Inc (rr, 5); Until rr >= r;

End;

Procedure Anim;

{процедура смены кадров}

Const

{задержка между кадрами, мc}

ms = 60;

Var

{параметр циклов смены}

i: Byte;

Begin

 

repeat

 

for i:= 0 to 1 do begin

{смены видеостраниц прямо}

SetVisualPage (i);

Delay (ms)

 

end;

 

for i:= 1 downto 0 do begin

{... и обратно}

SetVisualPage (i);

Delay (ms)

 

end;

{условие окончания показа}

until KeyPressed

End;

 

Var

{параметр (номер кадра)}

i: Byte;

Begin

{инициализация графики}

GrInit;

SetGraphMode(GetGraphMode);

{ режим . . . . . }

for i:= 1 downto 0 do begin

{цикл заполнения страниц}

SetVisualPage (Succ (i) mod 4);

{ видим пустоту }

SetActivePage (i);

{ и готовим кадр }

Forms (i);

{ рисунок кадра }

end;

{начало оживлениякадров}

Anim;

Close Graph

{закрытие режима графики}

End.

 

Особенность программы в том, что сначала кадры записываются на соответствующие страницы, а затем производится последователь-

ное переключение отображения страниц на дисплей процедурой

SetVisualPage.

Графические окна. Графическое окно (viewport) – это область про- смотра, окно экрана, в компьютерной графике часть пространства отображения, в которой изображается и просматривается часть мо-

Управление видеостраницами. Графические окна. Вывод текста

225

 

 

делируемого объекта. При образовании графического окна получа- ется как бы экран в экранезаданного размера.

В модуле Graph для описания графического окна объявлен сле- дующий тип и две константы:

Type

 

ViewPortType = Record

{границы окна}

X1, Y1, X2, Y2: Integer;

Clip: Boolean;

{режим отсечения}

End;

 

Const

{отсечение по границе окна включено}

ClipOn= True;

ClipOff= False;

{отсечение по границе окна выключено}

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

Объявление графического окна производится процедурой

SetViewPort (X1, Y1, X2, Y2: Integer; ClipMode: Boolean),

где входные параметры соответствуют полям записи типа ViewPortType. После выполнения этой процедуры все текущие уста- новки станут относиться к окну. Текущий указатель установится в его левый верхний угол, и туда же переносится начало системы ко- ординат дисплея, т.е. мы получаем локальную систему координат.

Если параметры процедуры заданы неправильно, то функция

GraphResult возвращает ошибку grError (– 11).

Назначение графического окна можно использовать для перемеще- ния начала системы координат. Так, если задать окно вызовом

SetViewPort (GetMaxX div 2, GetMaxY div 2, GetMaxX, GetMaxY, ClippOff),

то получим систему координат с началом в центре экрана. При этом станет видимойадресация отрицательных координат. Гра- фическое окно не меняет масштаба системы координат, а лишь вы- бирает систему отсчета адресуемых пикселов.

226

Лабораторная работа № 20

 

 

Для определения текущих параметров графического окна исполь-

зуют процедуру

GetViewSettings (Var ViewSettings: ViewPortType).

Если воспользоваться ею сразу после инициализации графического режима, то обнаружится, что графическим окном является весь эк- ран.

Для очистки графического окна служит специальная процедура

ClearViewPort.

Процедура PutImage работает одинаково как для значения парамет- ра ClipOn, так и для ClipOff. Об этом следует помнить при использо- вании данной процедуры.

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

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

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

С пакетом Turbo Pascal поставляется 4 шрифта. Кроме того, досту- пен системный матричный шрифт 8×8 для графических режимов (всегда доступны символы с кодами от 0 до 127 и символы с кода- ми от 128 до 255 при условии, что их матрицы загружены в память ЭВМ.

Для обозначения шрифтов введены пять констант:

Const

DefaultFont = 0;

{матричный шрифт 8x8 (по умолчанию)}

TriplexFont = 1;

{полужирный}

SmallFont = 2;

{светлый шрифт (тонкое начертание)}

Управление видеостраницами. Графические окна. Вывод текста

227

 

 

 

SansSerifFont = 3;

{рубленый шрифт}

 

GothicFont = 4;

{готический шрифт}

 

Активизация любого из названных шрифтов осуществляется про-

цедурой

SetTextStyle (Font, Direction: Word; CharSize: Word).

Здесь параметр Font номер шрифта, Direction расположение. Возможны лишь две ориентации текста, обозначенные константами

Const

HorizDir = 0;

{горизонтальное, слева направо}

VertDir = 1;

{вертикальное, снизу вверх}

На самом деле есть еще один вариант регулирования направления шрифтов. Если задать Direction = 2, то буквы будут повернуты так же, как и при Direction = VertDir, но вывод строки будет произво- диться горизонтально, слева направо.

Размер символа устанавливается параметром CharSize, диапазон изменения которого составляет от 0 до 10. Стандартное значение для матричного шрифта 8×8 равно 1, а для штриховых шрифтов – 4.

При каждом вызове процедурой SetTextStyle какоголибо шрифта он загружается в память ЭВМ. Поэтому, если программа использу- ет штриховые шрифты, необходимо, чтобы файлы этих шрифтов находились в известном каталоге совместно с BGIфайлами.

Для вывода текста есть две процедуры:

OutText (TexString: String),

которая выводит на графический экран строку TexString, ориенти- рованную относительно позиции текущего указателя, и

OutTextXY (TexString: String),

которая выводит строку, ориентированную относительно коорди- нат (X,Y). Шрифт предварительно может быть установлен вызовом SetTextStyle. Существует несколько вариантов ориентировки строки относительно стартовой точки. Они задаются процедурой

SetTextJustify (Horisontal, Vertical: Word),

228

Лабораторная работа № 20

 

 

параметры которой могут принимать одно из трех объявленных в модулеGraph значений:

Const

LeftText = 0;

{ для горизонтального ориентирования }

{ координата X задает левый край строки }

CenterText = 1;

{ координата X задает середину строки }

RightText = 2;

{ координата X задает правый край строки}

BottomText = 0;

{ для вертикального ориентирования }

{ координата Y задает нижний край строки }

CenterText = 1;

{ координата Y задает середину строки }

TopText = 2;

{ координата Y задает верхний край строки}

Эта процедура позволяет ориентировать выводимую строку отно- сительно стартовой координаты (X,Y). По умолчанию параметры

соответствуют LeftText, TopText.

Текстовые процедуры GoToXY, Write/Writeln и установки цвета тек- ста в графическом режиме работают только, если переменная мо- дуля CRT – DirectVideo равна False (или модуль CRT не подключен). Ввод текста через Read/Readln действует всегда. При этом текст стирает фоновое изображение.

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

Функции

TextHeight (TextString: String): Word

TextWidth (TextString: String): Word

возвращают высоту и ширину строк TextString в пикселах, при ус- ловии, что они будутвыведены текущим шрифтом и размером.

Пример анализа расположения строк текста приведен ниже:

Uses Graph;

 

{ $I initgraph.pas }

 

Const

 

my_str = 'Turbo Pascal';

{выводимая строка }

Var

 

maxx, maxy: Integer;

{текущее разрешение экрана}

tx, ty, i, j: Word;

{временные переменные}

Управление видеостраницами. Графические окна. Вывод текста

229

 

 

 

Begin

 

 

GrInit;

 

 

maxx:= GetMaxX; maxy:= GetMaxY;

{разрешение}

 

SetTextJustify (CenterText, CenterText);

{ориентация }

 

SetTextStyle (SmallFont, HorizDir, 6);

{стиль шрифта }

 

tx:= TextWidth (my_str);

{ширина строки }

 

ty:= TextHeight (my_str);

{высота строки }

 

for j:= 1 to (maxy div ty) do

{цикл по оси Y }

 

for j:= 1 to (maxx div tx) do

{цикл по оси X }

 

OutTextXY (i * tx, j* ty, my_str);

{тело циклов }

 

SetTextStyle (DefaultFont, HorizDir, 6);

{смена шрифта }

 

tx:= TextWidth ('W') div 6;

{1/6 ширины }

 

ty:= TextHeight ('E') div 6;

{1/6 высоты }

 

SetColor (LightRed);

 

 

OutTextXY (maxx div 2 + tx, maxy div 2 +

 

 

ty, my_str);

 

 

Readln;

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

 

CloseGraph

{закрытие режима графики}

 

End.

 

 

У процедуры OutTextXY есть одна особенность: выводимая тексто- вая строка всегда обрезается по границе графического окна. Более того, если активным является матричный шрифт (DefaultFont), то вылезающаястрока вообще не выводится на экран. Решать по- добные проблемы можно, точно рассчитывая место выводимых в графике строк.

Размер букв (высота и ширина) штриховых шрифтов (и только их)

может задаваться процедурой

SetUserCharSize (multX, divX, multY, divY: Word).

Она позволяет оперативно менять размер шрифта, установленный SetTextStyle. Отношение multX/divX задает масштабирование шири- ны начертания шрифта, а отношение multY/divY выражает масштаб изменения высоты шрифта. Например, задание multX = 3 и divX = 1 говорит о том, что буквы выводимого шрифта будутв три раза ши- ре нормы.

Полную информацию о текущем режиме вывода текста можно по- лучить, используя процедуру

230

Лабораторная работа № 20

 

 

GetTextSettings (Var Settings: TextSettingsType).

В параметре Settings она возвращает информацию обо всем, что от- носится к выводу строк. Тип этого параметра определен в модуле

Graph:

Type

TextSettingsType = Record

Font: Word;

{номер шрифта}

Direction: Word;

{направление }

CharSize: Word;

{размер шрифта }

Horiz: Word;

{ориентация по X }

Vert: Word;

{ориентация по Y }

End;

 

Текущим всегда является один тип. При необходимости быстро пе- реключаться с одного шрифта на другой удобно сохранять и вос- станавливать их параметры через переменные описанного типа.

КОНТРОЛЬНЫЕ ЗАДАНИЯ

1.Создайте на экране четыре окна. В двух окнах поместите простые графи- ческие рисунки (например, ряд концентрических окружностей разного цвета) с использованием различных режимов отсечения. В два других окна поместите тексты, иллюстрирующие возможность использования шрифтов разного типа, размера и расположения.

2.Подобным образом заполните пассивную страницу. Организуйте переклю- чение между страницами по нажатию клавиши пробел”.

231

Лабораторная работа № 21

УПРАВЛЕНИЕ КЛАВИАТУРОЙ

Технические особенности клавиатуры. Клавиатура ПЭВМ дос-

таточно сложное устройство, содержащее разнообразные электрон- ные компоненты, в том числе встроенный микропроцессор. Он уст- раняет многочисленные ложные импульсы, возникающие в момент нажатия клавиши и ее отпускания, и тем самым разгружает цен- тральный процессор. Кроме того, микропроцессор запоминает коды нажатых клавиш в буферной памяти, если по какимлибо причинам центральный процессор не успевает их обработать достаточно бы- стро, а затем по запросу центрального процессора передает их из памяти в том порядке, в каком они туда поступали. Наконец, мик- ропроцессор следит за временем, в течении которого клавиша удерживается в нажатом состоянии и осуществляет автоповтор ко- да клавиши, если это время превышает однудве секунды.

С точки зрения программирования, наиболее существенным об- стоятельством является то, что коды, вырабатываемые клавиатурой и коды, передаваемые в программу это разные коды. Выработан- ный клавиатурой код называется кодом сканирования. Кодов ска- нирования ровно столько, сколько клавиш на клавиатуре. Именно эти коды поступают от микропроцессора клавиатуры. Чтобы сооб- щить центральному процессору о готовности клавиатуры к переда- че кода, микропроцессор вырабатывает прерывание с номером 9. Программа обработки этого прерывания (драйвер клавиатуры) входит в состав DOS и размещается в ПЗУ. Драйвер клавиатуры осуществляет преобразование кода сканирования с учетом того, что могут быть одновременно нажаты две или более клавиш (например, клавиша Shift и какаянибудь литерная клавиша). В результате это-

го преобразования на выходе драйвера клавиатуры формируется тот код, который и воспринимается программой.

232

Лабораторная работа № 21

 

 

Микропроцессор клавиатуры дважды вырабатывает прерывание 9 – в момент нажатия клавиши и в момент ее отпускания. При отпус- кании клавиши передается двухбайтовая последовательность: сна- чала код $F0 (240), а затем код сканирования клавиши. Именно по- этому программа обработки прерываний может следить за одно- временным нажатием нескольких клавиш.

На клавиатуре ПЭВМ имеются три особые клавиши, называемые клавишами смещения они предназначены для расширения воз- можностей клавиатуры. К ним относятся клавиши Shift (временная смена регистра), Alt (дополнительный регистр) и Ctrl (управляющий регистр).Драйвер клавиатуры никогда не сообщает программе о нажатии на эти клавиши, однако он соответствующим образом пре- образует код сканирования, так что, например, а и А имеют разные коды, хотя вызываются нажатием на одну и ту же клавишу.

На стандартной клавиатуре IBM AT имеется 101 (или 102) клавиша. С учетом возможностей использования литерных клавиш совмест- но с тремя клавишами смещения, число возможных комбинаций составляет около 400, что много больше емкости одного байта. По- этому информация на выходе драйвера клавиатуры должна кодиро- ваться двумя байтами, причем далеко не каждая комбинация может быть отражена условным знаком (символом) на экране.

Все обычные алфавитноцифровые клавиши как в нижнем, так и в

верхнем регистрах вырабатывают на выходе драйвера однобайтный код символа. Этот код совпадает с указанным в таблице ASCII ко- дом соответствующего символа. Некоторые специальные клавиши, такие как F1...F10, курсорные клавиши и др., а также комбинации всех клавишей с Alt и Ctrl вырабатывают коды из так называемого расширенного набора символов. Эти коды передаются двухбайтной последовательностью, причем первый байт в этой последователь- ности нулевой. В таблице 1 приведены коды из расширенного на- бора.