лабораторные на Pasca (Кудрявцев)l
.pdf223
Лабораторная работа № 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, |
|
Управление видеостраницами. Графические окна. Вывод текста |
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),
то получим систему координат с началом в центре экрана. При этом станет “видимой” адресация отрицательных координат. Гра- фическое окно не меняет масштаба системы координат, а лишь вы- бирает систему отсчета адресуемых пикселов.
Управление видеостраницами. Графические окна. Вывод текста |
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),
Управление видеостраницами. Графические окна. Вывод текста |
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 приведены коды из расширенного на- бора.