Процедура GetLineSettings - возвращает текущий стиль линий

Заголовок:

Procedure GetLineSettings(var Stylelnfo: LineSettingsType)

Здесь Stylelnfo - переменная типа LineSettingsType, в которой возвращается текущий стиль линий.

Тип LineSettingsType определен в модуле Graph следующим образом:

type

LineSettingsType = record

LineStyle: Word; {Тип линии}

Pattern: Word; {Образец}

Thickness: Word {Толщина}

end;

Процедура SetWriteMode – задание способа построения линии

Устанавливает способ взаимодействия вновь выводимых линий с уже существующим на экране изображением.

Заголовок:

Procedure SetWriteMode(Mode);

Здесь Mode - выражение типа Integer, задающее способ взаимодействия выводимых линий с изображением.

Если параметр Mode имеет значение 0, выводимые линии накладываются на существующее изображение обычным образом. Если значение 1, то это наложение осуществляется с применением логической операции XOR (исключительное ИЛИ): в точках пересечения выводимой линии с имеющимся на экране изображением светимость пикселей инвертируется на обратную, так что два следующих друг за другом вывода одной и той же линии на экран не изменят его вид.

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

const

CopyPut = 0;{Наложение операцией MOV}

XORPut = 1;{Наложение операцией XOR}

В следующем примере на экране имитируется вид часового циферблата (рис. 1.4.5). Для наглядной демонстрации темп хода «часов» ускорен в 600 раз (см. оператор Delay (100)). При желании Вы сможете легко усложнить программу, связав ее показания с системными часами и добавив секундную стрелку. Для выхода из программы нажмите на любую клавишу.

Рис. 14.5. Часовой циферблат

Uses Graph, CRT;

var d,r,r1,r2,rr,k, x1,y1,x2,y2,x01,y01: Integer;

Xasp,Yasp: Word;

begin

{Инициируем графику}

d:= detect; InitGraph(d, r, '');

k:= GraphResult;

if k <> grOK then

WriteLn(GraphErrorMSG(k))

else

begin

{Определяем отношение сторон и размеры экрана}

x1:= GetMaxX div 2;

y1:= GetMaxY div 2;

GetAspectRatio(Xasp, Yasp);

{Вычисляем радиусы:}

r:= round(3*GetMaxY*Yasp/8/Xasp);

r1:= round(0.9*r); {Часовые деления}

г2:= round(0.95*r); {Минутные деления}

{Изображаем циферблат}

Circle(x1,y1,r); {Первая внешняя окружность}

Circle(x1,y1,round(1.02*г)); {Вторая окружность}

for k:= 0 to 59 do {Деления циферблата}

begin

if k mod 5=0 then

rr:= r1 {Часовые деления}

else

rr: = r2; {Минутные деления}

{Определяем координаты концов делений}

x0l:= x1+Round(rr*sin(2*pi*k/60));

y0l:= y1-Round(rr*Xasp*cos(2*pi*k/60)/Yasp);

x2:= x1+Round(r*sin(2*pi*k/60));

y2:= y1-Round(r*Xasp*cos(2*pi*k/60)/Yasp);

Line(x01,y01,x2,y2) {Выводим деление}

end;

{Готовим вывод стрелок}

SetWriteMode(XORPut);

SetLineStyle(SolidLn,0,ThickWidth);

{Счетчик минут в одном часе}

{k = минуты}

r:= 0;

{Цикл вывода стрелок}

repeat

for k:= 0 to 59 do if not KeyPressed then

begin

(Координаты часовой стрелки}

x2:=x1+Round(0.85*r1*sin(2*pi*r/60/12));

y2:= y1-Round(0.85*r1*Xasp*cos(2*pi*r/60/12)/Yasp);

{Координаты минутной стрелки}

x01:= x1+Round(r2*sin(2*pi*k/60));

y01:= y1-Round(r2*Xasp*cos(2*pi*k/60)/Yasp);

{Изображаем стрелки}

Line(x1,y1,x2,y2);

Line(x1,y1,x01,y01);

Delay(100); {Для имитации реального темпа нужно установить задержку 60000}

{Для удаления стрелок выводим их еще раз!}

Line(x1,y1,x01,y01);

Line(x1,y1,x2,y2);

{Наращиваем и корректируем счетчик минут в часе}

inc(r);

if r=12*60 then

r:= 0

end

until KeyPressed;

if ReadKey=#0 then k:= ord(ReadKey);

CloseGraph

end

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: