1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
| //---------------------------------------------------------------------------
#include "DateUtils.hpp" // для доступа к SecondOf, MinuteOf и
// HourOf
#include "math.h" // для доступа к sin и cos
#include <vcl.h>
#pragma hdrstop
#include <vector.h>
#define R 75 // радиус циферблата часов
int x0, y0; // центр циферблата
int ahr,amin,asec; // положение стрелок (угол)
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TDateTime t;
// зададим размер формы
// в соответствии с размером циферблата
ClientHeight = (R + 30)*2;
ClientWidth = (R + 30)*2;
x0 = R + 30;
y0 = R + 30;
t = Now();
/* Определить положение стрелок.
Угол между метками (цифрами) часов, например, цифрами 2 и
3, -30 градусов.
Угол между метками минут - 6 градусов.
Угол отсчитываем от 12-ти часов */
ahr = 90 - HourOf(t)*30-(MinuteOf(Today() ) / 12) *6;
amin = 90 - MinuteOf(t)*6;
asec = 90 - SecondOf( Today() )*6;
Timer1->Interval = 1000; // период сигнала от таймера
// 1 сек
Timer1->Enabled = true; // пуск таймера
// рисует вектор из точки (х0,у0) под углом а относительно
// оси X. Длинна вектора 1
}
void _fastcall TForm1::Vector(int x0, int y0, int a, int l);
{
// x0,y0 - начало вектора
//a - угол между осью х и вектором
// 1 - длина вектора
#define TORAD 0.0174532 // коэффициент пересчета угла из
// градусов в радианы
int х, у; // координаты конца вектора
Canvas->MoveTo(x0,у0);
х = хО + 1 * cos(a*TORAD);
у = у0 - 1 * sin(a*TORAD);
Canvas->LineTo(x,y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
int x, у; // координаты маркера на циферблате
int a; // угол между ОХ и прямой (х0,уо) (х,у)
int h; // метка часовой риски
TBrushStyle bs; // стиль кисти
TColor pc; // цвет карандаша
int pw; // ширина карандаша
bs = Canvas->Brush->Style;
pc = Canvas->Pen->Color;
pw = Canvas->Pen->Width;
Canvas->Brush->Style = bsClear;
Canvas->Pen->Width = 1;
Canvas->Pen->Color = clBlack;
a = 0; // метки ставим от 3-х часов, против часовой
// стрелки
h = 3; // угол 0 градусов - это 3 часа
// циферблат
while ( а < 360 )
{
х = хО + R * cos(а * TORAD);
у = хО - R * sin(а * TORAD);
Forml->Canvas->MoveTo(х,у);
if ( (a % 30) == 0
Canvas->Ellipse(х-2,у-2,х+3,у+3);
// цифры по большему радиусу
х = хО + (R+15) * cos(a * TORAD);
у = хО - (R+15) * sin(a * TORAD); . •
Canvas->TextOut(x-5,y-7,IntToStr(h));
h--;
if ( h == 0 ) h = 12;
}
else
Canvas->Ellipse (x.-l, y-1, x+1, y+1) ;
a = a + 6; // 1 минута - 6 градусов
}
// восстановить карандаш и кисть
Canvas->Brush->Style = bs;
Canvas->Pen->Width = pw;
Canvas->Pen->Color = pc;
DrawClock();
}
void fastcall_TForm1::DrawClock(void)
TDateTime t;
// шаг секундной и минутной стрелок 6 градусов,
// часовой - 30.
// стереть изображение стрелок
Canvas->Pen->Color = clBtnFace;
Canvas->Pen->Width = 3;
// часовую
Vector(xO,yO, ahr, R-20);
// минутную
Vector(xO,yO, amin, R-15);
// секундную
Vector(xO,yO, asec, R-7);
t = Now();
// новое положение стрелок
ahr = 90 - HourOf(t)*30-(MinuteOf(t)% 12)*6;
amin = 90 - MinuteOf(t)*6;
asec = 90 - SecondOf(t)*6;
// нарисовать стрелки
// часовая стрелка
Canvas->Pen->Width = 3;
Canvas->Pen->Color = clBlack;
Vector(xO,yO, ahr, R-20);
// минутная стрелка
Canvas->Pen-:>Width = 2 ;
Canvas->Pen->Color = clBlack;
Vector(xO,yO, amin, R-15);
// секундная стрелка
Canvas->Pen->Width = 1;
Canvas->Pen->Color = clYellow;
Vector(xO,yO, asec, R-7);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
DrawClock();
}
//--------------------------------------------------------------------------- |