ИНТЕРФЕЙС

advertisement
ИНТЕРФЕЙС
Из книги Румянцева Дмитрия, Монастырского Леонида «Путь
программиста: Опыт созидания личности программиста». – М.:
«Издательский Дом ИНФРА-М», 2000.
Интерфейс – лицо программы
Применительно к компьютеру под интерфейсом можно понимать
механизм
(совокупность
аппаратных
и
программных
средств)
взаимодействия человека и компьютера – он так и называется человекомашинный интерфейс.
Можно сделать предположение, что главная цель интерфейса – дать
возможность пользователю управлять работой компьютера. Но, пожалуй, это
не совсем верная мысль. Дело в том, что пользователь, как правило, лишен
активного желания управлять работой компьютера. Пользователю, сидящему
перед монитором, нужно только одно – выполнить свою работу, и компьютер
помогает ему сделать это лучше и быстрее. Следовательно, цель
пользователя – запустить на выполнение одну из имеющихся на данном
компьютере программ, а затем контролировать ход ее работы.
Какая же роль отводится при этом интерфейсу? Очень важная: он
должен максимально облегчить пользователю запуск программы и
работу с ней. Проще говоря, главная цель интерфейса – облегчение
пользованием компьютером. Но если интерфейс – механизм, то он должен
быть как можно более понятным пользователю, должен восприниматься им
как нечто естественное и единственно возможное.
Сегодня очевидно, что проблема создания качественного
интерфейса постепенно становится одной из главных проблем
современного программирования. Дело в том, что все большее количество
людей используют компьютер в своей повседневной деятельности, а это,
естественно, снижает требования к уровню подготовки пользователя и,
наоборот,
ужесточает
требования
к
интерфейсу,
создаваемому
программистом.
Немного истории
Поначалу никакого пользовательского интерфейса не существовало
или почти не существовало. Большие вычислительные машины –
мэйнфреймы – были наперечет, и их обслуживали бригады
высокопрофессиональных
инженеров.
Они
вводили
бесконечные
последовательности единиц и нулей, а затем, распечатав их на бесконечных
«простынях», долго эти же столбики единиц и нулей изучали. Хотя, конечно,
даже этот слепой ввод и распечатку уже можно было бы назвать неким
интерфейсом – ведь взаимодействие человека и компьютера происходило,
правда, слишком опосредованное.
Кому первому пришла в голову блестящая идея использовать для
вывода информации вместо печатного устройства электронно-лучевую
трубку (экран), не известно. Но это был значительный шаг на пути к
настоящему интерфейсу: теперь программист мог видеть, что он набирал.
Однако ввод программ по-прежнему оставался довольно унылым занятием.
Постепенно, однако, поняли, что некоторую часть рутинных операций можно
переложить с инженеров на специально подготовленных операторов. Сразу
же встала проблема: то, что понятно профессиональному программисту,
было трудно, а подчас невозможно объяснить оператору. Так возникла
проблема установления контакта между человеком и машиной. Рядовому
оператору понять привычную для программиста систему специальных
машинных команд оказалось довольно сложно.
Был найден замечательный выход из сложившейся ситуации. Суть
решения заключалась в следующем: если пользователь не может запомнить
абстрактные команды, то пусть он запомнит конкретные клавиши. В
клавиатуре вычислительных машин появилось дополнение в виде десяти
клавиш с литерой F и номерами от 1 до 10 (функциональные клавиши).
Даже если оператор не знал назначения всех клавиш, то ему достаточно было
знать хотя бы одну, самую первую клавишу – F1. Теперь в случае какоголибо затруднения оператор нажимал на клавишу F1 и получал некую помощь
(help) в виде списка клавиш с кратким описанием действия.
Появление функциональных клавиш открыло новые возможности в
деле организации интерфейса между человеком и машиной. Однако при
общении друг с другом пользователи норовили ткнуть пальцем в дисплей,
что натолкнуло разработчиков на идею создания устройства типа указки,
которым можно показывать что-то на экране.
Первоначально появилось так называемое световое перо, однако в силу
разных технических причин, оно не прижилось. Зато очень удобным
оказалось другое устройство, которое лежало на столе и было соединено с
машиной. Передвигая это устройство, можно было перемещать по экрану
курсор, квадрат, указывающий, в каком месте экрана появится следующий
введенный с клавиатуры символ. За свою форму и длинный «хвост»,
соединяющий его с компьютером, устройство назвали мышью, и это
название прижилось.
В начале 60-х годов Джордж Эванс и Айвен Сазерленд провели
исследование в области применения машинной графики. Сазерленд в своей
диссертации доказывал, что если вместо текста компьютер будет выводить
на экран изображения, это станет шагом вперед в плане удобства
пользования. С этого момента на авансцене компьютерной истории появился
так называемый графический пользовательский интерфейс.
Этот интерфейс используется и поныне. Суть его заключается в
следующем: для выполнения однотипных операций пользователю
предлагается не набирать команды или нажимать функциональные клавиши,
а указывать мышью – «кликать» – специальную пиктограмму,
олицетворяющую то или иное действие.
На следующем этапе необходимо было решить вопрос: как в рамках
одного персонального компьютера обеспечить взаимодействие одного
пользователя с несколькими программами? Эту проблему решили, создав так
называемый многооконный интерфейс.
Идею окон предложил Дуглас Энгельбарт. Окно как элемент
интерфейса появилось в текстовых редакторах еще до решения проблемы
многозадачности.
Многооконный графический интерфейс сразу приобрел массу
сторонников, главным образом благодаря простоте в обращении и
стандартизации – научившись работать с одной программой, легко можно
освоить любую другую, использующую этот же интерфейс. Окна можно
перетаскивать по экрану, увеличивать и уменьшать в размере.
Элементы интерфейса, подвластные человеку
Курсор. Поскольку машинный интерфейс начал развиваться с
оформления процедур ввода символов, курсор стал первым элементом
изображения на экране, не являясь частью вводимых данных.
После того, как появились программы, позволяющие редактировать
произвольные участки текста, то есть программы, изменяющие точку ввода,
отмечаемую курсором, на клавиатуре появились так называемые клавиши
управления курсором. С помощью этих клавиш (стрелок), которые и по сию
пору остаются одними из главных элементов интерфейса, можно
произвольно перемещать курсор по экрану. Сразу возникла проблема:
раньше курсор всегда находился в нижней строке экрана и был скорее
шлюзом, из которого последовательно появлялись символы, выстраиваясь в
строку текста; прямоугольный курсор, перемещаясь по всему экрану, терялся
среди массы других символов. Чтобы решить эту проблему, был разработан
механизм мигания курсора. Мигающий курсор, в отличие от своего
предшественника, сразу заметен на экране.
Сегодня курсор – естественный элемент интерфейса программ, в
которых осуществляется ввод данных. Мигающий курсор на экране означает,
что программа предлагает пользователю осуществить ввод какой-то
информации, и, наоборот, - когда программе не требуется получать данные
от пользователя, курсора на экране быть не должно.
Курсор создается на аппаратном уровне, то есть, всегда присутствует
на экране. Программист не может убрать его с экрана, но зато практически
все языки программирования дают возможность сделать его невидимым,
изменять его размеры, положение, режим мерцания.
Клавиши управления курсором. Существует четыре основных и
четыре дополнительных клавиши управления курсором, расположенные на
клавиатуре. К основным относятся клавиши с изображением стрелок. При
работе в текстовых редакторах этих клавиш оказывается недостаточно, если
требуется быстро переместиться в самое начало или конец текста,
осуществить необходимое перелистывание. Для этих целей существуют
клавиши Home, End, PgUp и PgDn. Но они, как и клавиши управления
курсором, не имеют каких-то связанных с ними процедур, и на программисте
лежит ответственность за те действия, которые будет выполнять программа в
случае выбора этих клавиш пользователем. Надо помнить, что пользователь,
скорее всего, будет ждать от них стандартных действий. Если при нажатии на
клавишу «стрелка вверх» произойдет запись на диск, пользователь, который
работал и с другими программами, будет ошеломлен. Если в вашу задачу не
входит ввергать его в состояние шока, старайтесь в своих программах
стандартным клавишам назначать стандартные действия.
Нет ни одного стандарта, который закреплял бы за теми или иными
клавишами те или иные действия, однако, есть такие клавиши, которые во
многих программах используются только для одного стандартного действия.
Будет ошибкой назначать в вашей программе этим клавишам другие
действия. Например, почти любая программа использует клавишу F1 для
вывода подсказки, клавишу Esc – для отказа или возврата к предыдущему
действию, а Enter – для подтверждения ввода. Эти клавиши – стандартные de
facto, и вы должны использовать их только для выполнения этих действий.
Лучше совсем не использовать в своей программе стандартные клавиши, чем
делать это не так, как в других программах.
Рабочая мышь. С появлением манипулятора «мышь» пользователь
получил дополнительную возможность показывать программе, что он хочет
сделать, а у программистов появилась дополнительная головная боль.
Операционная система MS-DOS, которая царила до Windows, не
поддерживала мышь явным образом. Однако после того как графический
интерфейс стал стандартом фактически, игнорировать мышь было уже
невозможно. Сегодня любая графическая оболочка поддерживает мышь, т.е.
принимает от нее команды.
Кое-что из того, что делает мышь в современном интерфейсе,
повторять с помощью клавиатуры не с руки. Возможно, название
манипулятора – «мышь» – натолкнуло авторов интерфейса на мысль о том,
что можно попытаться имитировать действия реальной мыши, хватающей
все, что плохо лежит, и утаскивающей к себе в нору (drag and drop).
Новую технологию так и назвали: drag and drop. Ее суть заключается в
следующем: пользователь с помощью мыши «захватывает» некий
графический объект на экране и перетаскивает его в другое место. Для
«захвата» достаточно нажать на левую кнопку мыши, когда ее указатель
стоит на нужном изображении, и не отпускать эту кнопку пока идет
«перетаскивание».
Так, назначение мыши и клавиатуры разделилось: клавиатурой стали
пользоваться в соответствующих окнах для ввода данных в текстовых
редакторах или в диалоговом режиме, а мышью для указания программе,
какую операцию нужно выполнить в следующий момент. Однако, поскольку
в отличие от клавиатуры, наличие мыши до сих пор не считается
обязательным, в любой программе любое действие мыши должно быть
продублировано соответствующей последовательностью действий на
клавиатуре.
Кстати, о кнопках мыши (mouse buttons). Существуют мыши
двухкнопочные и трехкнопочные. Программировать мышь следует таким
образом, чтобы при однократном нажатии левой кнопки указанный элемент
выделялся; двойной щелчок левой кнопки должен приводить к такому же
эффекту, что и нажатие кнопки Enter. Правая кнопка мыши обычно
программируется для некоторых дополнительных действий, связанных с
манипуляциями над указанным объектом. Средняя кнопка практически не
используется. Программисты обычно не задействуют ее потому, что нельзя
быть уверенным, что у пользователя окажется трехкнопочная мышь.
Элементы интерфейса со стороны машины
Мы рассмотрели основные виды воздействий, которые человек может
оказать на программу, т.е. сообщить компьютеру о том, что он хочет при
помощи клавиатуры или мыши. Но программа тоже должна указывать
пользователю, что она от него ждет.
Ввод данных. Как только появились программы, обрабатывающие
данные в диалоговом режиме, перед программистами встала задача, как
объяснить пользователю, что, собственно, от него ожидает программа.
Первые программы, обладавшие интерактивным интерфейсом (термин,
подразумевающий, что осуществляется человеко-машинный диалог), были
по-военному лаконичны. Пользователю в приказном порядке давались
директивы: «введите число от 100 до 50000», «нажмите клавишу 2» и т.п. Но
даже это на первых порах нравилось. Изумляла способность машины
выявлять ошибку или выявлять обман. Так, введя на запрос: «число от 100 до
50000» число 70, пользователь читал на экране: «Ошибка!». Чудо!
Всякий раз при вводе значений, особенно числовых, необходимо
осуществлять проверку. Программа (т.е., программист, разрабатывающий ее)
должна руководствоваться условным допущением: если пользователь
может сделать ошибку, он ее сделает обязательно.
Структура диалога типа меню. Однако до ввода значений нужно еще
добраться, а для этого пройти ряд последовательных блоков. Чаще всего
программа дает пользователю альтернативы для выбора действий. Например,
предлагает выбрать ввод данных, печать или их обработку, в конце концов,
программа может предложить пользователю закончить работу. Такой режим
выбора из нескольких альтернатив – больше, чем двух, – получил название
меню.
Алгоритм создания меню очень прост: каждый раз пользователю
предлагается сделать выбор из конечного списка внутри некоторого цикла.
Все нажатия «не относящихся к делу» клавиш игнорируются. При выборе
одной из альтернатив передача управления для ее обработки происходит при
помощи case-конструкции. Затем, после обработки этого пункта, управление
возвращается снова в цикл. При этом всегда должен быть предусмотрен
явный способ выхода из цикла обработки меню, например, путем нажатия
клавиши Esc.
Поддержка пользователя. В процессе работы пользователь
испытывает неуверенность в правильности своих действий. Иногда он может
пасть духом и испытывать потребность в поддержке. А что может лучше
поддержать пользователя, чем бодрящее сообщение: «Вы выполнили запуск
процедуры форматирования системного диска! Все ваши данные будут
потеряны!». Вы не задумывались над смыслом фразы: «Был сражен словами
наповал»? Это как раз тот самый случай. Если ваша программа выдаст такое
сообщение главному бухгалтеру большой организации в конце года, эффект
будет потрясающим, не исключен инфаркт.
Пользователь должен быть уверен, что программа контролирует все
его действия и выдаст предупреждение, если возникнет опасность нанесения
системе ущерба. Сообщения, которые программа выдает пользователю,
можно условно разделить на 4 группы:
 информационные;
 вопросительные;
 предостерегающие;
 запрещающие.
Информационные сообщения просто информируют пользователя о
том, что система правильно поняла его указание или выполняет какой-то
долговременный процесс. Словом, программа должна время от времени
подбадривать пользователя: мол «все идет нормально» или что-то в этом
духе.
Вопросительные сообщения программа должна выдавать, когда
возникает предположение, что данное действие, которое может иметь
необратимые последствия, пользователь выбрал случайно. Лучше, если
любое необратимое изменение данных, выбранное пользователем, программа
будет приостанавливать, выдавая вопросительные сообщения: «Вы
действительно решили удалить все записи?» или что-то в этом роде.
Выполнять действие можно только в случае утвердительного ответа
пользователя.
Вопросительное сообщение всегда подразумевает ответ пользователя
путем выбора кнопки «Да» или «Нет» (Ok или Cancel), либо нажатием
клавиш Enter или Esc, либо еще каким-то образом, но пользователь должен
дать системе ясное подтверждение или отказ на выполнение действия.
Предостерегающие сообщения должны выдаваться программой, если
пользователь хочет выбрать операцию, которая может привести к
необратимым изменениям, либо требующей полной загрузки ресурсов, что
надолго затормозит выполнение программы или даже приведет к останову
системы.
Запрещающие сообщения выдаются программой, если пользователь
хочет выбрать операцию, которую не имеет права выполнять.
Кроме разного рода сообщений теоретически каждая программа
должна иметь Help, вызываемый клавишей F1 или через пункт главного
меню, который называется «Подсказка» или «Помощь».
Кстати,
все
сообщения
по
возможности
должны
быть
стандартизированы не только внутри программы, но и в соответствии с тем,
как это принято в других программах. Нередко начинающие программисты
посылают пользователю излишне фамильярные, а порой просто грубые
сообщения. Это недопустимо. Но и обратный вариант, когда программа
излишне «приветлива», выдавая на экран вычурно вежливые фразы типа:
«Если вас не затруднит, введите, пожалуйста, ваш пароль», тоже нельзя
считать приемлемым. Программные сообщения должны быть составлены
в соответствии с нормами литературного языка, при этом быть
лаконичными и абсолютно понятными. Употребление в программном
сообщении всевозможных технических терминов и жаргонных слов крайне
нежелательно.
Время ответа. Важной характеристикой качества интерфейса является
скорость реагирования программы на действие пользователя. Например, если
пользователь выбирает какой-то пункт меню, а в ответ ничего не происходит,
он может попробовать выбрать этот пункт еще раз, подумав, что случайно
нажал не туда, а тем временем программа открывала нужный файл, но
пользователь об этом не знал, т.е. не получил соответствующего сообщения.
Правильна такая организация интерфейса, когда программа мгновенно
реагирует на любое действие. Если по каким-то причинам это невозможно,
например, для обработки длительного запроса следует открыть множество
файлов, а это требует длительного времени, все равно следует сразу же
выдать на экран сообщение с просьбой подождать: «Идет обработка,
ждите...». Правда, через некоторое время пользователя перестанет устраивать
и это сообщение. Действительно, если в течение нескольких минут
программа ничего не делает (по крайней мере, видимых результатов не
видно), то пользователь решит, что она «зависла».
Пользователь желает не только знать, что программа выполняет
выбранное им действие, но и иметь хотя бы приблизительное представление
о том, сколько ему осталось ждать до окончания длительного процесса.
Желательно, чтобы окончание длительного процесса сопровождалось
звуковым сигналом.
Создать хороший интерфейс – это почти половина дела в создании
современного программного продукта. Запомните, если с вашей очень
хорошей (с точки зрения алгоритма) программой пользователь будет
работать постоянно хватаясь за валерьянку, кляня «дурацкую технику», то, в
конце концов, он будет вынужден от вашей программы отказаться. Хороший
интерфейс с лихвой окупит некоторые огрехи программирования, о чем
свидетельствует шумный успех Microsoft Windows, а плохой – угробит труд
коллектива замечательных профессионалов, которые не позаботились о
создании качественного пользовательского интерфейса.
К сожалению, наличие множества стандартных библиотек для создания
основных элементов интерфейса, рождает у многих программистов иллюзию
того, что они могут создать хороший интерфейс за полчаса. Это неверный
подход. Программист должен тщательно продумывать структуру меню
программы, оформление диалоговых панелей, язык сообщений (ведь из
одних и тех же кирпичей можно выстроить дворец, а можно – неуклюжую
халупу).
ОРГАНИЗАЦИЯ ДИАЛОГА С ПРОГРАММОЙ
Для работы с текстовым экраном в Pascal есть стандартный модуль Crt.
Для того чтобы пользоваться его ресурсами, модуль нужно подключить к
программе. Для этого сразу после заголовка программы необходимо
написать предложение uses crt.
Например,
Program primer;
Uses crt;
Сразу после этого в программе становятся доступны все процедуры и
функции, константы и переменные, описанные в этом модуле.
Таблица 1. Константы режимов работы
Имя константы Номер режима
Режим
BW40
0
Черно-белый, 40 символов, 25 строк
CO40
1
Цветной, 40 символов, 25 строк
BW80
2
Черно-белый, 80 символов, 25 строк
CO80
3
Цветной, 80 символов, 25 строк
Mono
7
Монохромный, 8025, для монохромных
дисплеев
Имя константы
Black
Blue
Green
Cyan
Red
Magenta
Brown
LightGray
DarkGray
LightBlue
LightGreen
LightCyan
LightRed
LightMagenta
Yellow
White
Blink
Таблица 2. Константы цветов
Номер цвета
Цвет
0
Черный
1
Темно-синий
2
Темно-зеленый
3
Бирюзовый
4
Красный
5
Фиолетовый
6
Коричневый
7
Светло-серый
8
Темно-серый
9
Синий
10
Светло-зеленый
11
Светло-бирюзовый
12
Розовый
13
Малиновый
14
Желтый
15
Белый
128
Мерцание символа
Таблица 3. Процедуры и функции
Интерфейс
Назначение
Установка режимов и окон
Procedure AssignCrt (file: text);
Связывает окно дисплея с
текстовым
файлом,
что
позволяет ускорить вывод на
экран
Procedure ClrScr;
Очищает экран или окно (если
оно определено) и помещает
курсор в левый верхний угол,
после очистки экрана или окна
происходит
заполнение
цветом фона.
Procedure TextMode (mode: integer);
Установка текстового режима.
Mode – номер текстового режима или Каждая
новая
установка
соответствующая константа
режима
отменяет
все
предыдущие. Код режима
запоминается в глобальной
переменной LastMode типа
word модуля CRT и может
использоваться
для
восстановления
начального
состояния экрана.
Procedure Window (x1,y1,x2,y2: byte);
Определяет окно вывода в
(x1,y1) и (x2,y2) – координаты верхнего текстовом режиме. Каждое
левого и нижнего правого углов окна
новое обращение к Window
отменяет
предыдущее
определение
окна.
После
определения
окна
все
координаты
курсора
указываются
относительно
границ окна.
Управление цветом текста и фона
Procedure HighVideo;
Устанавливает
высокую
яркость выводимых символов
Procedure LowVideo;
Устанавливает
низкую
яркость выводимых символов
Procedure NormVideo;
Устанавливает
нормальную
яркость символов
Procedure TextColor (color: byte);
Устанавливает
цвет
Color – код цвета или соответствующая выводимых символов
константа
Procedure TextBackGround (color: byte);
Устанавливает цвет фона
Color – код цвета или соответствующая
константа
Управление выводом текста
Procedure ClrEol;
Стирает все символы от
текущей позиции курсора до
конца строки
Procedure DelLine;
Удаляет линию, в которой
находится курсор
Procedure InsLine;
Вставляет новую строку перед
строкой, где находится курсор
Работа с клавиатурой
Function KeyPressed: boolean;
Определяет, была ли нажата
Значение true, если нажата любая клавиша клавиша на клавиатуре
Function ReadKey: char;
Считывает символ из буфера
Значение функции – код клавиши, клавиатуры
нажатой на клавиатуре
Управление курсором
Procedure GoToXY (x,y: integer);
Перемещает
курсор
в
X,y – координаты курсора
указанные координаты экрана
или окна вывода
Function WhereX: integer;
Определяет
текущую
Значение функции – координата x курсора горизонтальную координату
курсора относительно окна
Function WhereY: integer;
Определяет
текущую
Значение функции - координата Y курсора вертикальную
координату
курсора относительно окна
Управление звуком
Procedure NoSound;
Выключает динамик
Procedure Sound (hz: word);
Включает звук динамика с
Hz – частота звука в герцах
заданной тональной частотой
Управление временем
Procedure Delay (ms: word);
Задержка
исполнения
Ms – значение задержки в миллисекундах программы на заданное число
миллисекунд
ЛАБОРАТОРНАЯ РАБОТА №11
Задание
Необходимо выполнить все приведенные ниже задания, а также
задания для самостоятельной работы. Задания выполняются не по вариантам.
Приветствуется проявление творчества при выполнении заданий.
1. Вводится три числа A, X, Y. Вывести значение A в точке с
координатами X, Y.
Program primer1;
Uses crt;
Var a: integer;
X: 1..80; Y: 1..25;
Begin
TextMode(2); {устанавливаем режим экрана чернобелый 80*25}
Readln (a, x, y);
GotoXY (x, y); {устанавливаем курсор в позицию с
координатами x,y}
Write(a);
Delay(10000); {устанавливаем время задержки}
End.
Задание для самостоятельной работы: установите цветной режим и
выведите значение A заданным цветом, добавьте режим мерцания.
2. Организовать ввод 10 чисел, чтобы запрос на каждое число
осуществлялся в центре экрана, а сами числа печатались разным цветом.
Program primer2;
Uses crt;
Var
I, k: integer;
Begin
Clrscr;
TextMode(CO80) {устанавливаем цветной режим экрана
80*25}
For i:=1 to 10 do
Begin
TextColor(i); {устанавливаем цвет символов}
Clrscr;
GotoXY(40,12);
Read(k);
End;
Delay(1000);
End.
Задание для самостоятельной работы: добавьте цвет фона,
попробуйте изменять его в цикле, только следите, чтобы цвет фона не
совпадал с цветом символов.
3. Самостоятельно организовать вывод чисел от 1 до 100 так, чтобы
они выводились в центре экрана через определенные промежутки времени.
4. Заполнить символьный массив так, чтобы каждый вводимый символ
отображался на экране, и при этом не нажималась клавиша Enter. Ввод
завершить по нажатию клавиши Esc.
Program primer4;
Uses crt;
Var
A: array [1..100] of char;
B: char; i, k: integer;
Begin
I:=0;
Repeat
B:=ReadKey; {читаем символ с клавиатуры без вывода
на экран}
K:=ord(b); {определяем код нажатой клавиши}
If k<>27 then begin i:=i+1; a[i]:=b; gotoXY(i,10);
write(b); end;
Until k=27; {цикл выполняется пока не будет нажата
клавиша Esc, имеющая код 27}
End.
Задание для самостоятельной работы: используя множества всех
букв алфавита и гласных букв, измените программу так, чтобы при вводе
гласные буквы печатались одним цветом, а согласные – другим.
5. Организовать движение курсора по экрану под управлением клавиш
управления курсором: , , , , а также дополнительных клавиш
управления Home, End, PageUp, PageDown.
Замечание: следует учесть, что клавиши управления курсором –
функциональные клавиши и при выполнении последовательности команд:
b:=readkey; c:=ord(b) переменная c будет иметь значение 0, поэтому
определить код нажатой клавиши можно с помощью этой же функции вида
ord(readkey).
Program primer5;
Uses crt;
Const {введем предельные значения координат в
текстовом режиме}
MinX=1;
MinY=1;
MaxX=80;
MaxY=25;
Var
Ch: char;
Kod: ineger;
X, y: byte;
Begin
Clrscr;
{вычислим координаты середины экрана}
X:=MaxX div 2;
Y:= MaxY div 2;
Repeat
GotoXY (x, y) {установим курсор}
Ch:=readkey;
Kod:=ord(readkey);
{пересчитаем координаты курсора в соответствии с
нажатой клавишей}
Case kod of
72: if y>MinY then y:=y-1; {нажата клавиша «вверх»}
80: if y<MaxY then y:=y+1; {нажата клавиша «вниз»}
77:
if
x<MaxX
then
x:=x+1;
{нажата
клавиша
«вправо»}
75: if x>MinX then x:=x-1; {нажата клавиша «влево»}
71: x:=MinX; {нажата клавиша Home}
79: x:=MaxX; {нажата клавиша End}
73: y:=MinY; {нажата клавиша PageUp}
81: y:=MaxY; {нажата клавиша PageDown}
end;
until ch=#27 {цикл выполняется, пока не будет
нажата клавиша Esc}
end.
Задание для самостоятельной работы: организовать движение
какого-либо символа по экрану с помощью клавиш управления.
6. Организовать меню из 3 пунктов: ввод данных, обработка данных,
выход из программы. Меню вывести в окне, расположенном в центре экрана.
Выбор пункта меню осуществлять по нажатию цифры, соответствующей его
номеру. При выборе пункта меню осуществлять обращение к процедурезаглушке (пустая процедура, не выполняющая никаких алгоритмических
действий), после выполнения которой вернуться к меню. Программа должна
завершаться при выборе пункта меню «выход из программы».
Program primer6;
uses crt;
var
punkt: char;
procedure punkt1;
begin
textmode(co80); textcolor(13); textbackground(0);
clrscr;
writeln ('Первый пункт меню');
delay (3000);
clrscr;
end;
procedure punkt2;
begin
textmode(co80); textcolor(13); textbackground(0);
clrscr ;
writeln ('Второй пункт меню');
delay (3000);
clrscr;
end;
begin
textmode(co80);
repeat
window(25,8,55,17);
textbackground(11) ;
textcolor(1);
clrscr;
gotoxy(5,2); write('1. Ввод данных ');
gotoxy(5,4); write('2. Обработка данных');
gotoxy(5,6); write('3. Выход из программы');
punkt:=readkey;
case punkt of
'1': punkt1;
'2': punkt2;
end;
until punkt='3';
end.
Задание для самостоятельной работы: Написать программу
тестирования. Тест, последовательность вопросов и варианты ответов
должны находиться в текстовом файле. Тему для теста, вопросы, варианты
ответов и интерфейс программы разработать самостоятельно.
Программа должна выставлять оценку по следующему правилу:
ОТЛИЧНО – за правильные ответы на все вопросы, ХОРОШО – если
испытуемый правильно ответил не менее, чем на 80% вопросов,
УДОВЛЕТВОРИТЕЛЬНО – если правильных ответов более 60%, и ПЛОХО
– если правильных ответов менее 60%.
РАБОТА С ГРАФИКОЙ
Основные понятия
В современных компьютерах изображения на экране строятся в виде
растров, и всегда прямоугольных.
Пример растра и изображения, построенного на нем:
На рисунке вы видите сильно увеличенную картинку, на самом же деле
элементарные точки, из которых состоит изображение, или пиксели,
должны быть очень маленькими, чтобы глаз воспринимал картинку как
единое целое. Пиксель (Pixel) – сокращение от Picture Element (элемент
рисунка).
Экраны цветных мониторов состоят из прямоугольной решетки точек
(пикселей), светящихся разным цветом. Каждый цветной пиксель образован
тремя более мелкими по площади участками красного, зеленого и синего
цветов. При свечении этих участков с разной интенсивностью цвета
смешиваются, создавая элементы изображения различных оттенков и яркости.
Важной характеристикой растра является его расширение, т.е.
количество точек (пикселей) на единицу длины. Чем это число выше, тем
более мелкими являются сами пиксели, и, соответственно, более плотно они
располагаются на плоскости, что и приводит к тому, что мы воспринимаем их
как единое, цельное изображение. Из года в год разрешающая способность
мониторов, принтеров, сканеров и т.п. растет.
Итак, на растровом устройстве отображения любая фигура состоит из
множества точек пикселей. Естественно, положение каждой точки
изображения задано координатами X и Y. Координаты – целые числа, они
задают номера колонки и строки растра и не зависят от физического размера
экрана. Оси координат направлены следующим образом: горизонтальная ось
X направлена слева направо; вертикальная ось Y направлена сверху вниз;
верхний левый угол имеет координаты (0,0).
0, 0
X
Y
Очевидно, что запись изображения требует хранения информации о
положении множества точек, для каждой из которых должен быть задан цвет.
Цветное изображение получается смешиванием трех основных цветов –
красного, зеленого и синего. Такая модель представления цвета называется
моделью RGB (Red- Green- Blue). Управляя интенсивностью компонентов,
можно получить различные оттенки и степени интенсивности цвета. В
частности, для получения градаций серого надо взять интенсивности трех
основных цветов равными друг другу.
В современных SVGA мониторах предусмотрено, как правило, по 26=64
уровня интенсивности каждого из основных цветов, таким образом, в целом
можно получить (26)3=262144 цвета. Для представления большего числа
цветов необходим больший объем памяти. Один бит может кодировать два
цвета: 1 – белый, 0 – черный. Два бита могут хранить 22=4 цветовых
комбинации, 4 бита – 16, 8 бит – 256, 16 бит – 65536, 32 бита – 4294967296.
Если для каждой точки задавать уровни красного, зеленого и синего
цветов, то потребуется достаточно большой объем памяти для хранения
информации об изображении. Для сокращения объема памяти используются
палитры. При этом ограничиваются некоторым количеством цветов, например
16 или 256, каждому из цветов присваивается номер (соответственно, от 0 до
15 или от 0 до 255), и при записи изображения используют именно этот код.
«Точка цвета номер 5». Информация о палитре, то есть данные, сколько
красного, зеленого и синего нужно взять для получения «цвета номер 5»,
хранится и используется отдельно от записи изображения.
Важное понятие в машинной графике – графический примитив –
совокупность пикселей, определяющая некоторую геометрическую фигуру.
Наиболее распространенные примитивы – это точка, линия, прямоугольник,
закрашенный прямоугольник, окружность и эллипс.
Растровые изображения обладают одним очень существенным
недостатком: их трудно увеличивать или уменьшать, т.е. масштабировать.
При уменьшении растрового изображения несколько соседних точек
преобразуются в одну, поэтому теряется разборчивость мелких деталей. При
увеличении – увеличивается размер каждой точки, поэтому появляется
ступенчатый эффект. Кроме того растровые изображения занимают много
места в памяти.
Чтобы избежать указанных проблем, изобрели так называемый
векторный способ кодирования изображений.
Векторный способ представления графики заключается в том, что
геометрические фигуры, кривые и прямые линии, составляющие рисунок,
хранятся в памяти компьютера в виде математических формул и
геометрических абстракций: круг, квадрат, эллипс и т.п. Для каждого
примитива существуют свои характерные параметры. Например, для отрезка –
это координаты концов; для окружности – координаты центра и радиус. Т.е.
размеры, кривизна, местоположение элементов изображения хранятся в виде
числовых коэффициентов. Благодаря этому появляется возможность
масштабировать изображения, поворачивать, подвергать любым другим
геометрическим преобразованиям с помощью простых математических
операций, в частности, простым умножением параметров на коэффициент
масштабирования. При этом качество изображения не меняется.
Формирование изображения на экране
Из книги Румянцева Дмитрия, Монастырского Леонида «Путь
программиста: Опыт созидания личности программиста». – М.:
«Издательский Дом ИНФРА-М», 2000.
Программисту не обязательно знать технические подробности
конструкции монитора, но общее представление о его схеме он иметь должен.
Еще важнее представлять, как программа работает с памятью, когда
осуществляет вывод информации на какое-либо из устройств визуального
отображения, подключенных к компьютеру.
Участок оперативной памяти компьютера, где хранится информация об
изображении, появляющемся на экране, называется видеопамятью. Иногда
эту область называют видеобуфером. Видеопамять занимает определенную
область в адресном пространстве оперативной памяти компьютера,
следовательно, видеопамять имеет ограниченный размер.
Видеопамять и похожа, и в то же время не похожа на RAM. Обычная
память соединена с центральным процессором специальным устройством,
которое называется шина данных. Не останавливаясь подробнее на
конструкции шины данных, скажем лишь, что это просто пакет проводов,
количество которых кратно двум. Можно сказать, что чем больше проводов в
пакете, тем быстрее происходит обмен данными между процессором и
памятью. Современные Pentium-машины имеют 32-разрядную шину, т.е.
процессор может сразу читать 4 байта из памяти (и столько же в нее
записывать). Разрядность шины данных – одно из самых узких мест в
конструкции компьютера.
Видеопамять, как и любая другая память, соединена с процессором
шиной данных. Но видеопамять, кроме того, подключена к специальной
электронной схеме, которая на основе данных, хранящихся в видеобуфере,
формирует изображение на экране. Физически экранное изображение
обновляется 60 раз в секунду – с такой частотой упомянутая электронная
схема осуществляет сканирование видеобуфера. Поэтому любое изменение
состояния видеобуфера практически мгновенно (с точки зрения человека,
смотрящего на экран) приводит к изменению изображения на экране.
Электронная схема, сканирующая видеобуфер и преобразующая
двоичные числа в видеосигнал, называется адаптером видеодисплея или
просто видеоадаптером.
Сегодня все большую популярность приобретают так называемые
жидкокристаллические мониторы. Но большинство действующих сегодня
мониторов по-прежнему представляют собой устройства, изображения в
которых строится с помощью электронно-лучевой трубки. Напомним еще раз
известный из курса физики принцип формирования изображения,
получаемого в этом случае.
Этот способ называется растровым сканированием. Изображение
«рисуется» тщательно сфокусированным электронным лучом. Поток
электронов «бомбардирует» экран, покрытый специальным светящимся
веществом – люминофором. Места, в которые ударяются электроны,
начинают фосфоресцировать. В каждой точке свечение затухает
приблизительно в течение нескольких сотых долей секунды, поэтому
необходимо постоянно повторять «бомбардировку» поверхности экрана. Это
задача специального устройства – электронной пушки. Наводчик электронной
пушки (специальное электронное устройство) рассматривает весь экран как
последовательность множества линий. Он «простреливает» последовательно
каждую линию – слева направо, точка за точкой.
Движение луча по экрану происходит с огромной скоростью. Чтобы
изображение, которое воспринимает человек, не было мерцающим, весь цикл
– от первой до последней строки – должен быть закончен за 1/60 секунды (или
еще быстрее). Следовательно, за секунду происходит не менее 60 проходов
луча по всему экрану, строка за строкой. Такая схема формирования
изображения называется растром. После того, как луч доходит до последней
точки последней строки (до правого нижнего угла экрана), он мгновенно по
диагонали переносится в начало первой строки экрана (левый верхний угол),
и процесс повторяется.
Формирование цветного изображения осуществляется не одним, а тремя
электронными лучами (красным, зеленым и синим), перемещающимся по
экрану одновременно. Три луча подсвечивают сразу три элемента экрана,
расположенных на очень незначительном угловом расстоянии друг от друга,
поэтому человеческий глаз воспринимает эти три элемента как одну точку.
Благодаря различной интенсивности свечения каждой из трех точек и эффекту
аддитивного смешения трех цветов такая составная точка может иметь любой
цветовой оттенок. Качество изображения тем выше, чем меньше расстояние
между двумя отдельными точками. В современных мониторах расстояние
между точками не превышает 0.25–0.26 мм.
Вернемся к видеоадаптеру. Помимо всего прочего, он должен подавать
специальные синхронизирующие сигналы электронной пушке для
правильного
формирования
изображения
на
экране.
Первый
синхронизирующий сигнал – V-сигнал – подается для начала сканирования
экрана; второй сигнал – H-сигнал – для начала сканирования очередной
строки. Кроме того, видеоадаптер должен управлять интенсивностью
сканирующего луча. Интенсивность луча может меняться при прохождении
каждой растровой точки, а значит можно произвольно менять и
интенсивность свечения точки.
Существует
два
принципиально
разных
способа
указания
интенсивности свечения пикселя.
Первый применяется в так называемых цифровых мониторах. В этом
случае для каждой точки монитору подается информация об ее интенсивности
в виде двоичного числа. Используя аддитивную модель, передавая два бита
для каждого цвета (красный, зеленый и синий), из которых формируется цвет
точки, можно получить 64 цвета (4*4*4). Однако при увеличении количества
цветов нужно увеличивать и количество битов для каждого цвета (т.е.
количество проводов для каждого цвета).
Поэтому конструкторы мониторов, в конце концов, отказались от
цифровой схемы и пришли к аналоговой. При этой схеме сигналы V и H
остаются по-прежнему цифровыми, а сигналы о трех составляющих цвета
становятся аналоговыми и поступают по трем проводам. На каждом проводе
поддерживается напряжение от 0 до 1 вольта с плавным переходом из одного
состояния в другое. Ноль вольт на проводе указывает на отсутствие свечения,
1 вольт – на максимальное свечение. При такой схеме каждый из трех цветов
условно может принимать бесконечное число оттенков. Следовательно, таким
образом можно задавать десятки миллионов цветов.
Работа с графикой в Паскале
Инициализация графического режима. Множество графических
процедур и функций среды программирования Pascal собраны в модуле Graph.
Для подключения библиотеки графических функций и процедур необходимо
подключить модуль к вашей программе строкой
Uses graph;
Взаимодействие программы и видеосистемы в графических режимах
обеспечивают драйверы. Драйверы собраны в файлах, имеющих расширение
BGI: CGA.BGI, EGAVGA.BGI, HERC.BGI, IBM8514.BGI, ATT.BGI,
PC3270.BGI и др. Драйвер – это специальная программа, осуществляющая
управление тем или иным техническим средством ПК. Графический драйвер
управляет графическим адаптером в графическом режиме.
Графические возможности конкретного адаптера определяются
разрешением экрана, т.е. общим количеством пикселей, а также количеством
цветов. Кроме того, многие адаптеры могут работать с несколькими
графическими страницами.
Для инициализации графического режима используется процедура:
InitGraph (var Driver, Mode: integer; Path:string);
Где Driver – переменная типа integer, определяющая тип графического
драйвера; Mode – переменная того же типа, задающая режим работы
графического адаптера; Path – выражение типа string, содержащее путь
доступа к файлу драйвера.
Таблица 1. Константы, определяющие графический режим
Графический драйвер
И Значение
мя
Detect
0
CGA
1
MCGA
2
EGA
3
VGA
9
Константа режима
Имя
Значение
Растр
Выбор драйвера автоматически
CgaC0
0
320*200
CgaC1
1
320*200
CgaC2
2
320*200
CgaC3
3
320*200
CgaHi
4
640*200
McgaC0
0
320*200
McgaC1
1
320*200
McgaC2
2
320*200
McgaC3
3
320*200
mcgaMed
4
640*200
McgaHi
5
640*480
EgaLo
0
640*200
EgaHi
1
640*350
VgaLo
0
640*200
VgaMed
1
640*350
VgaHi
2
640*480
Палитра
Число
страниц
C0
C1
C2
C3
2 цвета
C0
C1
C2
C3
2 цвета
2 цвета
16 цвет.
16 цвет.
16 цвет.
16 цвет.
16 цвет.
1
1
1
1
1
1
1
1
1
1
1
4
2
2
2
1
Пример фрагмента программы, где инициализируется графический
режим:
Program primer;
Uses graph;
Var
D,m: integer; {переменные для установки драйвера и режима
работы}
Begin
D:=9;
M:=2;
InitGraph(d,m,
‘здесь
нужно
указать
путь
к
драйверу
EGAVGA.BGI’}
……
Наиболее простой способ выбора графического драйвера и режима –
автоматический (detect).
Program primer;
Uses graph;
Var D,m: integer; {переменные для установки драйвера и
режима работы}
Begin
D:=detect;
InitGraph(d,m,
‘здесь
нужно
указать
путь
к
драйверу
EGAVGA.BGI’}
Проверка результата инициализации графического режима. Для
проверки успешности инициализации графического режима существует
функция GraphResult, которая имеет тип результата integer, в котором
закодирован результат последнего обращения к графическим процедурам.
Если ошибка не обнаружена, значением функции будет 0, в противном случае
– отрицательное число, имеющее следующий смысл:
GrOk=0; {нет ошибок}
GrInitGraph=-1{не инициирован графический режим}
GrNotDetect=-2 {не определен тип драйвера}
GrFileNotFind=-3 {не найден графический драйвер}
GrInvalidDriver=-4 {неправильный тип драйвера}
GrNoLoadMem=-5 {нет памяти для размещения драйвера}
GrNoScanMem=-6 {нет памяти для просмотра областей}
GrNoFloodMem=-7 {нет памяти для закраски областей}
GrFontNotFound=-8 {не найден файл со шрифтом}
GrNoFontMem=-9 {нет памяти для размещения шрифта}
GrInvalidMode=-10 {неправильный графический режим}
GrError=-11 {общая ошибка}
GrIOError=-12 {ошибка ввода-вывода}
GrInvalidFont=-13 {неправильный формат шрифта}
GrInvalidFontNum=-14 {неправильный номер шрифта}
Завершение работы графического режима. Завершает работу
адаптера в графическом режиме и восстанавливает текстовый режим работы
экрана процедура CloseGraph.
Запомните! Любая программа, использующая графический режим,
будет иметь одну и ту же структуру:
1.
2.
3.
4.
5.
определение графического драйвера;
установка графического режима;
инициализация графического режима;
построения;
закрытие графического режима.
Напишем заготовку типовой программы работы с графикой:
Program primer;
Uses graph;
Var D,m: integer: {переменные для установки драйвера,
режима}
Begin
D:= detect;
InirGraph(d,m, ‘путь к драйверу’);
If GrapfResult=0 then {если инициализация прошла успешно}
begin
<описание всех ваших построений>
closeGraph;
end
else writeln (‘произошла ошибка при инициализации графики’);
end.
Некоторые процедуры для работы с графикой
Установка цвета. Драйвер EGAVGA.BGI позволяет использовать 16
цветов. Каждому цвету присвоен код – целое число, которое используется
процедурами и функциями.
Таблица 2. Константы цветов
Имя константы
Black
Blue
Green
Cyan
Red
Magenta
Brown
LightGray
DarkGray
LightBlue
LightGreen
LightCyan
LightRed
LightMagenta
Yellow
White
Номер цвета
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Цвет
Черный
Темно-синий
Темно-зеленый
Бирюзовый
Красный
Фиолетовый
Коричневый
Светло-серый
Темно-серый
Синий
Светло-зеленый
Светло-бирюзовый
Розовый
Малиновый
Желтый
Белый
Цвет выводимых в графическом режиме на экран линий и символов
можно задать процедурой
SetColor (color: word);
аргумент которой – целое число от 0 до 15 или имя одной из приведенных
выше констант.
Установка цвета действует на те линии и тексты, которые выводятся
после ее вызова, но не меняет цвет линий и символов, выведенных на экран
ранее. Таким образом, процедуру SetColor следует вызывать каждый раз перед
выбором нового цвета. Если цвет не установлен, то используется белый цвет.
Установка цвета фона. Чтобы установить цвет фона для всего экрана,
используется процедура:
SetBkColor (color: word);
Если процедура установки цвета фона не вызвана, экран будет черным.
Установка указателя вывода
Процедура MoveTo (x,y: integer) перемещает указатель в точку с
координатами x,y.
Процедура MoveRel (dx,dy: integer) перемещает указатель на dx, dy
пикселей относительно последнего положения.
Функции GetX и GetY возвращают координаты x, y указателя вывода.
Установка точки
Процедура PutPixel (x,y: integer; color: word) устанавливает точку с
координатами (x,y) и закрашивает ее указанным цветом color.
Функция GetPixel (x,y: integer): word возвращает значение цвета, в
который окрашена точка с координатами (x,y).
Рисование линий
Процедура Line (x1,y1,x2,y2: integer) вычерчивает линию между двумя
точками экрана с координатами (x1, y1) и (x2, y2).
Процедура LineTo (x,y: integer) вычерчивает линию от последнего
положения указателя до точки с координатами (x, y).
Окружность, эллипс, дуга, сектор
Процедура Circle (x,y: integer; r: word) вычерчивает окружность радиуса
r с центром в точке с координатами (x, y).
Процедура Arc (x, y, ugol_begin, ugol_end, r: integer) вычерчивает дугу
окружности радиуса r с центром в точке с координатами (x, y). Параметры
ugol_begin и ugol_end задают угловые координаты начала и конца дуги.
Отсчет углов ведется против часовой стрелки. Значения угловых координат
задается в градусах.
Процедура Ellips (x, y: integer; ugol_begin, ugol_end, rx, ry: word)
вычерчивает эллипс или дугу эллипса с центром в точке с координатами
(x, y). Параметры ugol_begin и ugol_end задают угловые координаты начала и
конца дуги. Параметры rx и ry определяют горизонтальный и вертикальный
радиусы эллипса.
Процедура PieSlice (x, y: integer; ugol_begin, ugol_end, r: word)
вычерчивает сектор окружности радиуса r с центром в точке с координатами
(x, y). Параметры ugol_begin и ugol_end задают угловые координаты начала и
конца сектора.
Сектор может быть закрашен в соответствии со стилем, заданным
процедурой SetFillStyle (о ней чуть позже).
Процедура Sector (x, y: integer; ugol_begin, ugol_end, rx, ry: word)
вычерчивает сектор эллипса с центром в точке с координатами (x, y) и
горизонтальным радиусом rx, вертикальным - ry. Параметры ugol_begin и
ugol_end задают угловые координаты начала и конца сектора.
Сектор может быть закрашен в соответствии со стилем, заданным
процедурой SetFillStyle.
Прямоугольник; закрашенный прямоугольник; параллелепипед
Процедура Rectangle (x1, y1, x2, y2: integer) вычерчивает контур
прямоугольника. Параметры x1, y1 задают положение левого верхнего угла,
x2, y2 – правого нижнего.
Процедура Bar (x1, y1, x2, y2: integer) вычерчивает закрашенный
прямоугольник. Параметры x1, y1 задают положение левого верхнего угла, x2,
y2 – правого нижнего. Стиль и цвет заливки определяется процедурой
SetFillStyle.
Процедура Bar3D (x1,y1,x2,y2: integer; глубина: word; граница: boolean)
вычерчивает параллелепипед. Параметры x1, y1 задают положение левого
верхнего угла, x2, y2 – правого нижнего угла ближней грани. Параметр
глубина задает расстояние между передней и задней гранями в пикселях.
Параметр граница определяет, нужно ли вычерчивать верхнюю границу
задней грани параллелепипеда. Стиль и цвет заливки ближней грани
определяется процедурой SetFillStyle.
Вывод текста в графическом режиме.
Процедура OutText (text: string) выводит строку символов text от
текущей позиции указателя вывода и перемещает указатель в точку,
расположенную за последним выведенным символом.
Процедура OutTextXY (x, y: integer; text: string) выводит строку
символов text, начиная с точки с координатами (x, y), при этом указатель
своего положения не меняет, т.е. остается в точке (x, y).
Стиль вычерчиваемых линий, контуров
Процедура SetLineStyle (type, pattern, thick: word) устанавливает стиль
вычерчиваемых линий. Здесь type, pattern, thick – соответственно тип, образец
и толщина линии.
Тип линии может быть задан с помощью одной из следующих констант:
SolidLn=0 {сплошная линия}
DottedLn=1 {точечная линия}
CenterLn=2 {штрих-пунктирная линия}
DashedLn=3 {пунктирная линия}
UserBitLn=4 {узор определяет пользователь}
Параметр Pattern учитывается только для линий, вид которых
определяется пользователем, т.е. если type=4. Во всех остальных случаях
можно поставить любое значение типа word (но обязательно поставить, всетаки это параметр процедуры, значит должен быть).
Каким образом можно задать пользовательский тип линии? Под тип
линии отводится переменная типа word, т.е. два байта. Эти два байта и
определяют образец линии: каждый установленный в единицу бит этого слова
соответствует светящейся точке, нулевой бит - несветящийся пиксель. Таким
образом, задается отрезок линии длиной в 16 пикселей. Этот образец
периодически повторяется по всей длине линии.
Параметр thick может принимать одно из двух значений:
NormWidth=1 {толщина в 1 пиксель}
ThickWidth=3 {толщина в 3 пикселя}
Стиль и цвет заливки
Процедура SetFillStyle (style, color: word) устанавливает стиль и цвет
заливки (закрашивания) областей (Bar, Bar3D, Sector и др.). В качестве
параметра style используют одну из констант:
EmptyFill=0 {заливка цветом фона}
SolidFill=1 {сплошная заливка текущим цветом}
LineFill=2 {горизонтальная штриховка}
LtSlashFill=3 {штриховка под углом 45 влево тонкими линиями}
SlashFill=4 {штриховка под углом 45 влево утолщенными линиями}
BkSlashFill=5 {штриховка под углом 45 вправо утолщенная}
LtBkSlashFill=6 {штриховка под углом 45 вправо тонкая}
HatchFill=7 {заполнение +++++}
XHatchFill=8 {заполнение под углом 45 редкой косой клеткой}
InterleaveFill=9 {заполнение под углом 45 частой косой клеткой}
WideDotFill=10 {заполнение редкими точками}
CloseDotFill=11 {заполнение частыми точками}
UserFill=12 {узор определяется пользователем}
Стиль вывода текста
Процедура SetTextStyle (font, orient, size: word) устанавливает шрифт
font, ориентацию orient и размер size текста, выводимого на экран. Параметр
font может принимать одну из констант:
DefaultFont=0 {стандартный, каждый символ размером 8*8 пикселей}
TriplexFont=1 {Triplex шрифт}
SmallFont=2 {мелкий}
SansSerifFont=3 {SansSerif шрифт}
GothicFont=4 {готический}
В 7.0 версии Паскаля набор шрифтов значительно расширен, но для
новых шрифтов не придуманы мнемонические константы, поэтому можно
использовать такие номера шрифтов:
5 - «рукописный» шрифт (scri.chr);
6 - одноштриховой шрифт типа Courier (simp.chr);
7 - наклонный шрифт типа Times Italic (tscr.chr);
8 - шрифт типа Times Rovan (lcom.chr);
9 - шрифт типа Courier увеличенного размера (euro.chr);
10 - крупный двухштриховой шрифт (bold.chr).
Замечание: все шрифты, кроме стандартного (матричного), являются
векторными, что позволяет изменять их размеры без ухудшения качества.
Каждый из этих шрифтов размещается в отдельном файле. Для использования
этих шрифтов необходимо разместить соответствующий файл в рабочем
каталоге, в противном случае вызов этого шрифта игнорируется и
подключается стандартный шрифт.
Параметр orient задает ориентацию выводимого текста:
HorizDir=1 {слева направо}
VertDir=2{снизу вверх}
Каждый шрифт способен десятикратно изменять свои размеры. Размер
шрифта задается параметром size, который может иметь значения от 1 до 10
(точечный или матричный шрифт – в диапазоне от 1 до 32).
Заполнение (закрашивание) произвольной замкнутой фигуры
Процедура FloodFill (x, y: integer; border: word) заполняет произвольную
замкнутую фигуру, используя текущий стиль и цвет заполнения. Координаты
точки (x, y) указывают, начиная с какой точки будет производиться заливка.
Если точка находится внутри замкнутой фигуры, то будет закрашена
внутренняя область. Если фигура не замкнута, то заливка разольется по всему
экрану. Параметр border указывает цвет граничной линии.
Очистка графического экрана
Процедура ClearDevise очищает графический экран, устанавливает
указатель в левый верхний угол.
ЛАБОРАТОРНАЯ РАБОТА №12
Задание
Необходимо выполнить все приведенные ниже задания, а также задания
для самостоятельной работы. Задания выполняются не по вариантам.
Приветствуется проявление творчества при выполнении заданий.
Замечание: в дальнейшем фрагменты программ будут приведены без
указания пути доступа к графическому драйверу в процедуре InitGraph. Не
забудьте выяснить, где расположены драйверы на вашем компьютере, и
вписать этот параметр.
1. Нарисовать 20 вертикальных отрезков в ряд.
Program primer1;
Uses graph;
var I, d, m: integer;
Begin
D:=detect;
Initgraph (d, m, ‘’);
For I:=1 to 20 do
Line (20*I, 100, 20*I, 200);
End.
Задание для самостоятельной работы: добавьте цвет выводимых
отрезков. Нарисуйте 20 горизонтальных цветных отрезков.
2. Нарисовать 10 закрашенных в разные цвета окружностей так, чтобы
они касались друг друга в 1 точке.
3. Нарисовать квадрат и вписанную в него окружность
Program primer3;
Uses graph;
var d, m: integer;
Begin
D:=detect;
Initgraph (d, m, ‘’);
Rectangle (100,100, 200, 200);
Circle (150,150, 50);
End.
Задание для самостоятельной работы: добавьте цвет, заливку
квадрата и окружности.
4. Нарисовать пирамиду из 10 эллипсов, каждый закрасить в свой цвет.
5 .Вывести текст в заданном месте экрана и заставить его переливаться
разными цветами.
Program primer5;
Uses graph, crt;
var I, d, m: integer;
Begin
D:=detect;
Initgraph (d, m, ‘’);
For I:=1 to 15 do
Begin
Setcolor (i);
OuttextXY
(100,50,
режиме’);
Delay(1000);
End;
End.
‘Выводим
сообщение
в
графическом
Задание для самостоятельной работы: попробуйте изменить шрифт,
размер и ориентацию текста.
6. Организовать движение точки по экрану слева напрво.
Program primer5;
Uses graph;
var I, d, m: integer;
Begin
D:=detect;
Initgraph (d, m, ‘’);
For I:=1 to 600 do
Begin
Putpixel (I, 200, 0); {рисуем точку цветом фона}
Putpixel (I+1, 200, 15); {рисуем белую точку на новом месте}
End;
End.
Задание для самостоятельной работы: измените траекторию
движения точки на вертикальную, наклонную, по кривой, например, по
синусоиде или по окружности.
7. Движение по экрану горизонтального отрезка.
Program primer5;
Uses graph, crt;
var I, d, m: integer;
Begin
D:=detect;
Initgraph (d, m, ‘’);
Line (10, 100, 60, 100);
For I:=1 to 600 do
Begin
Putpixel (9+I, 100, 0) {закрашиваем левую точку отрезка в
цвет фона}
Putpixel (60+I, 100, 15) {справа пририсовываем белую точку}
Delay(100);
End;
End.
Задание для самостоятельной
двигаться закрашенный прямоугольник.
работы:
попробуйте
заставить
8. Создать эффект плавного сжатия окружности по оси Y.
9. Построить модель пульсирующего круга. Закрашенный круг сначала
плавно увеличивается до определенного размера, а затем уменьшается.
10. Изобразить на экране движущуюся змейку.
ЛИТЕРАТУРА
1. Грызлов В.И., Грызлова Т.П. Турбо Паскаль 7.0 – М.: ДМК, 1998.
2. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. – М.:
«Нолидж», издатель Молгачева С.В., 2001.
3. Марченко А.И., Марченко Л.М. Программирование в среде Turbo Pascal
7.0. – К.: ВЕК+, М.: ДЕСС, 1999.
4. Семакин И.Г., Шестаков А.П. Основы программирования: Учебник. – М.:
Мастерство; НМЦ СПО; Высшая школа, 2001.
5. Румянцев Дмитрий, Монастырский Леонид. Путь программиста: Опыт
созидания личности программиста. – М.: «Издательский Дом ИНФРА-М»,
2000.
6. Культин Н. Б. Turbo Pascal в задачах и примерах. – СПб.: БХВ-Петербург,
2000.
7. Потопахин В. В. Turbo Pascal. Освой на примерах. – СПб.: БХВ-Петербург,
2005.
Download