19.2.5. Управление режимом вывода отрезков на экран

We use cookies. Read the Privacy and Cookie Policy

При рисовании отрезков на экране можно назначать режим поразрядного совмещения изображений. От него зависит, будет ли стерта при наложении двух точек «нижняя», и каким способом можно снять «верхнее» изображение с экрана. Управляя этим режимом, можно получать эффекты мультипликации. Сам режим задастся процедурой

SetWriteMode( WriteMode : Integer ).

Для задания параметра WriteMode в модуле Graph описаны пять констант, каждой из которых соответствует поразрядная операция (табл. 19.5).

Таблица 19.5

Имя константы

Значение

Логическая операция

Ее действие

CopyPut

MOV

Замещение

XORPut

XOR

Исключающее 'Или'

ORPut

OR

'Или'

ANDPut

AND

'И'

NOTPut

NOT

'НЕ'

- 420 -

Поскольку рисование на экране, по сути, является действием с битами, при прорисовке точек производятся логические операции между битами памяти монитора и битами изображения. Для описываемой процедуры разрешены только первые две операции: первая — замещение (очистка перед прорисовкой) и вторая (очень интересная) — XOR. Дело в том, что две последовательно проведенные логические операции XOR приведут биты памяти монитора в исходное состояние. Фактически это означает, что если есть какое-нибудь изображение на экране, то использовав его в качестве фона и нарисовав на нем картинку, можно восстановить его, прорисовав картинку еще раз (рис. 19.8). При инициализации и после смены режимов устанавливается режим CopyPut.

| Graph, CRT; { подключены Graph и CRT }

| {$I initgraf.pas} { процедура инициализации }

| VAR

| dx, dy, x, у : Integer; { рабочие переменные }

| maxx, maxy : Integer; { разрешение монитора }

| BEGIN

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

| maxx := GetMaxX; { функции из раздела 19.3 }

| maxy := GetMaxY;

| dx := maxx DIV 4; { вычисление стороны }

| dy := maxy DIV 4; { прямоугольника }

| Bar3D( dx, dy, maxx-dx, maxy-dy, 30,True ); { разд.19.5.3 }

| SetWriteMode( XORput ); { установка режима XOR }

| repeat { пока не нажата клавиша.. }

| x := Random( maxx - dx ); { случайная точка экрана }

| у := Random( maxy - dy );

| { рисование прямоугольника }

| Rectangle( x,y, x+dx, y+dy);

| Delay( 200 ); { пауза в 200 мс }

| { стирание прямоугольника }

| Rectangle( x,y, x+dx, y+dy );

| until KeyPressed; { условие конца цикла }

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

| CloseGraph { закрытие графики }

| END.

Рис. 19.8

Режим, заданный процедурой SetWriteMode, распространяется только на рисование отрезками, т.е. на процедуры Line, LineTo, LineRel, а также Rectangle и DrawPoly.

- 421 -