Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Стивенс Ал. Весь текст 495.21 Kb

Техника программирования на турбо-С

Предыдущая страница Следующая страница
1 2 3 4 5 6 7 8  9 10 11 12 13 14 15 ... 43
¦ АДДДДДДДДДДДДДДДДДДДДДДДДДДЩ                              ¦
¦                                                           ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

           Рис. 5.2  Наложение окон

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

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


ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦             ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬                ¦
¦             ¦                            ¦                ¦
¦             ¦                            ¦                ¦
¦             ¦                  ЪДДДДДДДДДБДДДДДД¬         ¦
¦             ¦                  ¦                ¦         ¦
¦ ЪДДДДДДДДДДДґ                  ¦   Окно  D      ¦         ¦
¦ ¦           ¦          Окно  B ¦                ¦         ¦
¦ ¦           ¦                  ¦                ¦         ¦
¦ ¦           ¦   ЪДДДДДДДДДДДДДДґ                ГДД¬      ¦
¦ ¦           ¦   ¦  Окно  C     ¦                ¦  ¦      ¦
¦ ¦        Окн¦   ¦     ЪДДДДДДДДБДДДДДДДДДДДДДДДДБД¬¦      ¦
¦ ¦           ¦   ¦     ¦                           ¦¦      ¦
¦ ¦           ¦   ¦     ¦                           ¦¦      ¦
¦ ¦           АДДДґ     ¦        Окно  E            ¦¦      ¦
¦ ¦               ¦     ¦                           ¦¦      ¦
¦ АДДДДДДДДДДДДДДДґ     ¦                           ¦¦      ¦
¦                 ¦     АДДДДДДДДВДДДДДДДДДДДДДДДДВДЩ¦      ¦
¦                 ¦              АДДДДДДДДДДДДДДДДЩ  ¦      ¦
¦                 АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ      ¦
¦                                                           ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Рис. 5.2  Наложение нескольких окон

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

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

     Чтобы понять, как можно управлять изображением на экране, вы
должны  разобраться  в  организации видеопамяти.  Приводимые ниже
сведения представляют собой введение  в  архитектуру  видеопамяти
IBM  PC.  Для получения исчерпывающей информации по этому вопросу
обращайтесь к "Руководству Питера Нортона  для  программистов  по
IBM PC" (Питер Нортон, Мicrosoft Press, 1985).



        Архитектура видеопамяти
-----------------------------------------------------------------

     Система формирования   изображения   является   неотъемлемой
частью  ПЭВМ  IBM PC.  В  более ранних  моделях  персональных ЭВМ
видеотерминалы   подключались   через    последовательные   порты
ввода/вывода,  но аппаратная архитектура IBM PC включает в себя и
видеосистему.

     Предназначенное для вывода на экран изображение  создается в
видеопамяти.  В  IBM PC в качестве видеопамяти используется часть
оперативной памяти.  Видеопамять  доступна  для  чтения  и записи
процессору  и,   следовательно, вашим программам. Видеопроцессор,
входящий  в состав видеоконтроллера,   по содержимому видеопамяти
постоянно   формирует   изображение на  экране  дисплея.  Поэтому
каждый новый символ,   записанный в видеопамять, почти немедленно
появляется   на  экране.   Поскольку   видеопамять  доступна  для
микропроцессора,     то    скорость    формирования   изображения
соответствует   скорости  пересылки  содержимого  памяти, которая
превышает скорость передачи данных при подключении видеотерминала
через последовательные порты ввода/вывода.

     Адреса видеопамяти и ее характеристики являются стандартными
для всех ПЭВМ линии IBM PC, а также совместимых с ними.

     ПЭВМ типа IBM PC  может  иметь  одну  из  трех  видеосистем,
использующих  различные  типы  видеомониторов  и,  следовательно,
различные типы видеоконтроллеров.  Видеоконтроллер  первого  типа
называется  Монохромным  Адаптером  (МА),  он обеспечивает работу
только  монохромного  видеомонитора  в  символьном  режиме  и  не
поддерживает  графического  режима.  Видеоконтроллер второго типа
называется  Цветным  Графическим  Адаптером  (CGA).   С   помощью
контроллера  CGA  подключается  цветной  монитор,  который  может
работать в двух различных режимах.  В символьном  режиме  имеется
возможность выбирать цвет фона и цвет символа из восьми возможных
цветов,  а также один из двух  уровней  интенсивности  цвета  для
символа.   В   графическом  режиме  низкого  разрешения  (640x200
растровых точек) можно работать только  с  одним  цветом.  Третий
видеоконтроллер    называется   Усовершенствованным   Графическим
Адаптером (EGA),  который поддерживает такой же символьный режим,
что  и  CGA,  и  многоцветный  графический  режим  более высокого
разрешения.

     Приведенные в  данной  книге  программы  работают с любым из
этих контроллеров в символьном режиме.  Поскольку в  этом  режиме
контроллеры   CGA   и   EGA   функционально    эквивалентны,   то
нижеследующие  рассуждения   для  CGA  относятся   к  обоим  этим
контроллерам.

     Видеопамять организована в виде двумерного массива символов,
состоящего из рядов и колонок. Ее можно рассматривать и как набор
следующих друг за другом 16-разрядных слов,  по одному на  каждый
символ. Каждый ряд содержит 80 следующих друг за другом символов,
все  они образуют  25  следующих друг  за  другом  колонок. Слово
содержит  информацию  об  одном   символе   и   состоит  из  двух
восьмибитных байт:  один -  для ASCII-кода символа,  второй - для
атрибутов  символа,  определяющих   его  изображение.   Код ASCII
записан в младшем (правом) байте слова.

     Видеопамять контроллера  МА  организована   в   виде   одной
страницы,  а контроллера CGA - в виде четырех страниц.  Программы
из этой  книги  используют  только  первую  страницу  видеопамяти
контроллера CGA.

     Видеопамять расположена   в   верхних   областях  доступного
процессору   адресного   пространства.   Разработчики   IBM   PC,
столкнувшись  с  ограничением  на  максимальный объем адресуемого
адресного  пространства   в   1   мегабайт,   решили   разместить
видеопамять  и  ПЗУ  Базовой  Системы  Ввода-Вывода  (ROM BIOS) в
верхних областях этого пространства.  Для того,  чтобы  позволить
контроллерам   МА   и  CGA  работать  совместно  на  одной  ПЭВМ,
разработчики назначили различные адреса сегментов видеопамяти для
разных контроллеров.  Память контроллера МА начинается в сегменте
0xB000,  а память контроллера CGA - в сегменте 0xB800.  Программа
может  определить,  какой  из  контроллеров  используется,  путем
вызова соответствующей функции  ROM  BIOS,  и  настроиться  таким
образом  на соответствующий адрес сегмента видеопамяти. Поскольку
архитектура видеопамяти для того  и  другого  случая  в  основном
одинакова,  то  необходимые действия по настройке программы будут
минимальными.

     Байт атрибутов  символа  содержит   2   трехразрядных   поля
кодирования  цвета  (одно для цвета фона символа и одно для цвета
самого символа),  разряд для задания уровня  интенсивности  цвета
символа  и  разряд  для установки режима мерцания символа при его
отображении.  На  рис.  5.4   представлена   конфигурация   байта
атрибутов.
ЪДДДДВДДДДВДДДДВДДДДВДДДДВДДДДВДДДДВДДДД¬
¦    ¦    ¦    ¦    ¦    ¦    ¦    ¦    ¦
¦ B  ¦ R  ¦ G  ¦ B  ¦ I  ¦ R  ¦ G  ¦ B  ¦
¦    ¦    ¦    ¦    ¦    ¦    ¦    ¦    ¦
АДВДД†ДДДДБДДДДБДДДД†ДДВД†ДДДДБДДДДБДДДДґ
  ¦  АДДДДДДДВДДДДДДЩ  ¦ АДДДДДДДВДДДДДДЩ
  ¦          ¦         ¦         ¦
  ¦          ¦         ¦         АДДДДДДД цвет символа
  ¦          ¦         ¦
  ¦          ¦         АДДДДДДДДДДДДДДДДД интенсивность цвета
  ¦          ¦                                        символа
  ¦          АДДДДДДДДДДДДДДДДДДДДДДДДДДД цвет фона
  ¦
  АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД мерцание символа


           Рис. 5.4   Байт атрибутов символа


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

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

     Поскольку вы теперь знаете,  где размещена видеопамять и что
в нее может быть записано, то можете использовать программу pokes
из  библиотеки  Турбо  Си  для формирования изображения на экране
дисплея.  Ниже приводится  листинг  5.1  маленькой  программы под
названием vidpoke.c,  которая записывает строку непосредственно в
видеопамять.   Исходя  из  предположения,  что  на  вашей  машине
работает контроллер CGA,  программа формирует для каждого символа
байт атрибута со значением 7, что соответствут отображению строки
в  виде  белых   символов   на черном фоне.   Если вы используете
Монохромный Адаптер,  измените в строке # define VSEG значение  с
0xB800  на 0xB000.

        Листинг 5.1: vidpoke.c

/* vidpoke.c */

#define VSEG 0x6800
char vdata [] =  "Что сделал Кан?";
main()
{
char *vp;
Предыдущая страница Следующая страница
1 2 3 4 5 6 7 8  9 10 11 12 13 14 15 ... 43
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама