Заголовок:
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.