- •1. Этапы создания программного обеспечения
- •1.1. Постановка задачи
- •1.2. Анализ, формальная постановка и выбор метода решения
- •1.3. Проектирование
- •8.1. Управление экраном в текстовом режиме.
- •8.2. Управление клавиатурой
- •8.3. Управление динамиком
- •8.5. Управление экраном в графическом режиме
- •8.7. Практикум. Создание движущихся изображений
- •Примеры Пример 8.7. Программа рисует человечка, делающего утреннюю зарядку.
- •Пример 8.10. Программа изображает планету, вращающуюся вокруг Солнца на фоне мерцающих звезд и расходящейся галактики.
- •Демонстрация
- •Создание иллюзии движения
8.1. Управление экраном в текстовом режиме.
В консольном режиме вывод на экран происходит построчно, доступ возможен только к последней выводимой строке. По мере заполнения экрана осуществляется его «прокрутка», при которой строки перемещаются по экрану вверх, причем верхние строки безвозвратно теряются, а внизу появляются новые строки. В таком режиме программист почти не может управлять формой представления выводимой информации. В текстовом режиме программист имеет доступ ко всему экрану. Экран при этом поделен на строки и столбцы. На пересечении строки и столбца находится область, в которою возможен вывод одного знака. Такие области получили название знакоместо.
Обычно программа на Borland Pascal использует тот же текстовый режим, что и MS DOS, т.е. режим, при котором на экране выделяется 25 строк и 80 столбцов.
Рис. 8.1. Схема управления экраном в текстовом режиме.
Каждому знакоместу экрана в специальной памяти, называемой видеобуфером, соответствует 2 байта, в которых хранится информация о высвечиваемом символе:
• код символа по таблице ASCII, которому соответствует матрица изображения символа в специальной таблице знакогенератора;
• байт атрибут, в котором хранится информация о цвет символа и цвете фона данного знакоместа (рис. 8.1).
Изображение на экране получают с помощью электронного луча, который обходит экран слева направо и сверху вниз с заданной частотой развертки.
Каждая точка при этом высвечивается цветом символа или цветом фона знакоместа, которому она принадлежит. Информация о знакоместе выбирается из видеобуфера. Таким образом, если изменить информацию в видеобуфере, то изменится и изображение на экране. Цвета в текстовом режиме формируются следующим образом: три бита управляют включением и выключением трех основных цветов (синего, зеленого и красного) и один бит - яркостью (табл. 8.1).
Таблица 8.1
Ресурсы модуля crt для управления экраном.
Управление экраном с помощью ресурсов модуля crt базируется на понятии «окно».
Окно - часть экрана прямоугольной формы. В момент получения программой управления весь экран считается окном 25x80 знакомест. Программист может определять на экране новые окна и управлять как цветом символов и фона окна, так и размещением информации в окне. Вывод информации в текстовом режиме осуществляется стандартными процедурами Write и WriteLn текущими цветом символа и цветом фона.
При выводе четыре символа интерпретируются особым образом:
#7 - звуковой сигнал;
#8 - перемещение курсора влево на один символ;
#10 - перемещение курсора на строку вниз (если курсор находился в последней строке, то содержимое экран «прокручивается» на строку вверх);
#13 - перемещение курсора в начало текущей строки.
Рис. 8.2. Текущее окно на экране и относительная адресация символа в окне
Процедуры начинают вывод с того места, где стоит курсор. Координаты курсора определяются относительно верхнего левого угла текущего окна (рис. 8.2). Для управления окнами и размещения в них информации модуль crt содержит следующие процедуры и функции.
1. Процедура Window(xl, у1, х2, y2:word) - определяет на экране окно. Местоположение и размеры окна определяются координатами верхнего левого (х1, у1) и нижнего правого (х2, у2) углов прямоугольника. Координаты текущего окна модуль crt хранит в специальных переменных:
WindMin, WindMax:word.
Откуда координаты текущего окна можно определить, применив функции 1о и hi, которые выделяют из слова младший и старший байты соответственно:
xl=Lo(WindMin) - координата х верхнего левого угла;
у1=Hi(WindMin) - координата у верхнего левого угла;
x2=Lo(WindMax) - координата х нижнего правого угла;
y2=Hi(WindMax) - координата у нижнего правого угла.
После объявления окна курсор устанавливается в верхний левый угол окна.
2. Процедура TextColor(color:byte) - устанавливает текущий цвет вывода символов в окне.
3. Процедура TextBackGround(color:byte) - устанавливает текущий цвет фона окна. Цвета для процедур TextColor и TextBackGround можно задавать, используя специальные константы модуля crt:
Black=0; {черный} DarkGrey=8; {темно-серый}
Blue=1; {синий} LightBlue=9; {светло-синий}
Green=2; {зеленый} LightGreen=10; {светло-зеленый}
Cyan=3; {голубой} LightCyan=11; {светло-голубой}
Red=4; {красный} LightRed=12; {розовый}
Magenta=5; {фиолетовый} LightMagenta=13; {сиреневый}
Brown=6; {коричневый} Yellow=14; {желтый}
LightGrey=7; {светло-серый} White=15; {белый}
Blink=128; {мерцание}
Текущие цвета символа и фона в виде байта атрибута хранятся в переменной TextAttr:word. Текущий цвет фона из этой переменной определяется как
(TextAttr div 16) mod 8,
a текущий цвет символа как
TextAttr mod 16.
4. Процедура ClrScr - очищает окно, выводя в него пробелы с текущим атрибутом. После этого курсор устанавливается в верхний левый угол окна. Если окно не установлено, то очищается весь экран. Эту процедуру обычно используют после определения окна и атрибута его символов, чтобы обозначить окно на экране.
5. Функция WhereX:word - возвращает координату х текущего положения курсора в окне.
6. Функция WhereY:word - возвращает координату у текущего положения курсора в окне.
7. Процедура GotoXY(x,y:word) - перемещает курсор на знакоместо с координатами x и у.
Модуль crt содержит также процедуры, работающие с текущей строкой (строкой, в которой стоит курсор).
8. Процедура DelLine - удаляет текущую строку.
9. Процедура InsLine - вставляет строку, сдвигая остальные строки вниз.
10. Процедура ClrEol – стирает часть строки справа от курсора.
Пример 8.1.
Разработать программу вычисления среднего арифметического заданного количества чисел n, где n<10. Реализовать оконный интерфейс, представленный на рис. 8.3. Верхнее окно интерфейса не зависит от исходных данных. Его нужно определить, задать цвета символов и фона, очистить и вывести в него текст. Ввод ответа пользователя будет выполняться с того места, где окажется курсор. Количество окон для ввода чисел зависит от введенного значения. Их положение на экране необходимо рассчитать.
Рис. 8.3. Интерфейс программы вычисления среднего арифметического
Нижнее окно также не зависит от исходных данных. Его нужно определить и внести в него результат. Ниже представлена соответствующая программа с комментариями.
Program ex;
Uses Crt;
Var a:array[1 10] of integer;
x,dx,n,i:integer; s:real;
Begin
ClrScr; {очищаем экран}
Window(20,3,50,5); {выделяем окно ввода количества чисел}
TextAttr:=16+7; {определяем светло-серые символы на синем фоне}
ClrScr; { выделяем окно ввода}
GotoXY(2,2); {устанавливаем курсор для вывода запроса}
Write(‘введите количество чисел:’); {выводим запрос}
ReadLn(n); {вводим ответ пользователя}
dx:=(80-(n+1)*3)div n;
х:=0;
s:=0;
TextAttr:=2*I6+14; {желтые символы на зеленом фоне}
for i:=1 to n do
begin х:=х+3;
Window(x,7,x+dx,9); {устанавливаем окно ввода данных}
ClrScr; {выделяем это окно}
GotoXY(2,2); {устанавливаем курсор для ввода данных}
ReadLn(a[i]); {вводим число}
s:=s+a[i];
x:=x+dx;
end;
TextAttr:=4*16+14; {желтые символы на красном фоне}
Window(18,11,53,13); {устанавливаем окно результата}
ClrScr; {выделяем окно результата}
GotoXY(3,2); {устанавливаем курсор для вывода результата}
Write('Cpeднee арифметическое =’, s/n:5:2);
ReadLn; {ожидаем нажатия клавиши Enter}
Window(1,1,80,25); {восстанавливаем окно на весь экран}
TextAttr:=7; {восстанавливаем стандартные цвета}
ClrScr; {очищаем экран}
End.
