
Эксперт
  
Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004
Репутация: 7 Всего: 23
|
Взято из книжки "VB Освой самостоятельно" (Никита Культин): | Код | Const R = 70 ' радиус циферблата часов Const GRAD = 0.0174532 ' коэффициент пересчета угла ' из градусов в радианы Const PI = 3.14159265
Dim x0 As Integer, y0 As Integer ' центр циферблата Dim ahr As Integer ' положение стрелок (угол) Dim amin As Integer Dim asec As Integer
' инициализация формы Private Sub Form_Initialize() Form1.Height = (Form1.Height - Form1.ScaleHeight) + _ (R + 10) * 2 * Screen.TwipsPerPixelY Form1.Width = (Form1.Width - Form1.ScaleWidth) + _ (R + 10) * 2 * Screen.TwipsPerPixelX ' Form1.Height - высота формы, включая заголовок и границы ' Form1.ScaleHeight - высота формы без заголовка и границ, ' аналогично для Form1.Width и Form1.ScaleWidth. ' (R + 10) * 2 умножается на Screen.TwipsPerPixelY, ' т. к. Form1.Height задается в твипах, а не в пикселях, ' аналогично для (R + 10) * 2 и Screen.TwipsPerPixelX.
x0 = R + 10 y0 = R + 10
' положение стрелок ahr = 90 - Hour(Time) * 30 - (Minute(Time) / 12) * 6 amin = 90 - Minute(Time) * 6 asec = 90 - Second(Time) * 6
Timer1.Interval = 1000 ' период сигналов таймера - 1 сек Timer1.Enabled = True ' запуск таймера Form1.ScaleMode = 3 End Sub
' процедура вычерчивает вектор заданной длины из точки (x0,y0) Sub Vector(x0 As Integer, y0 As Integer, _ a As Integer, l As Integer) ' x0, y0 - начало вектора ' a - угол между осью X и вектором ' l - длина вектора Dim x, y As Integer ' координаты конца вектора
x = Round(x0 + l * Cos(a * GRAD)) y = Round(y0 - l * Sin(a * GRAD)) Line (x0, y0)-(x, y) End Sub
' процедура рисует стрелки Sub DrawClock() ' шаг секундной и минутной стрелок 6 градусов, ' часовой - 30.
' стирание изображений стрелок Form1.DrawWidth = 3 ' задание толщины линии Form1.ForeColor = Form1.BackColor ' часовая стрелка Call Vector(x0, y0, ahr, R - 20) ' минутная стрелка Call Vector(x0, y0, amin, R - 15) ' секундная стрелка Call Vector(x0, y0, asec, R - 7)
' определение нового положения стрелок ahr = 90 - Hour(Time) * 30 - (Minute(Time) / 12) * 6 amin = 90 - Minute(Time) * 6 asec = 90 - Second(Time) * 6 ' прорисовка стрелок на новом положении ' часовая стрелка Form1.DrawWidth = 3 Form1.ForeColor = RGB(0, 0, 0) Call Vector(x0, y0, ahr, R - 20) ' минутная стрелка Form1.DrawWidth = 2 Call Vector(x0, y0, amin, R - 15) ' секундная стрелка Form1.DrawWidth = 1 Form1.ForeColor = RGB(200, 0, 0) Call Vector(x0, y0, asec, R - 7) End Sub
' прорисовка циферблата и начальных стрелок Private Sub Form_Paint() Dim x As Integer ' координаты маркера Dim y As Integer ' на циферблате Dim a As Integer ' угол между осью X и ' прямой (x0, y0) - (x, y)
Form1.DrawWidth = 1 Form1.ForeColor = RGB(0, 0, 0)
a = 0 ' метки ставим от 3-х часов, против ' часовой стрелки
' циферблат While (a < 360) x = x0 + Round(R * Cos(a * 2 * PI / 360)) y = x0 - Round(R * Sin(a * 2 * PI / 360)) If (a Mod 30) = 0 Then Circle (x, y), 2 Else: Circle (x, y), 1 End If
a = a + 6 ' 1 минута - 6 градусов Wend
Call DrawClock End Sub
' прорисовка текущих положений стрелок часов Private Sub Timer1_Timer() Call DrawClock End Sub |
И вариант №2: | Код | Const R = 60 ' радиус циферблата часов Const GRAD = 0.0174532 ' коэффициент пересчета угла ' из градусов в радианы Const PI = 3.14159265
Dim x0 As Integer, y0 As Integer ' центр циферблата Dim ahr As Integer ' положение стрелок (угол) Dim amin As Integer Dim asec As Integer
' инициализация формы Private Sub Form_Initialize() Form1.Height = (Form1.Height - Form1.ScaleHeight) + _ (R + 30) * 2 * Screen.TwipsPerPixelY Form1.Width = (Form1.Width - Form1.ScaleWidth) + _ (R + 30) * 2 * Screen.TwipsPerPixelX
x0 = R + 30 y0 = R + 30
' положение стрелок ahr = 90 - Hour(Time) * 30 - (Minute(Time) / 12) * 6 amin = 90 - Minute(Time) * 6 asec = 90 - Second(Time) * 6
Timer1.Interval = 1000 ' период сигналов таймера - 1 сек Timer1.Enabled = True ' запуск таймера Form1.ScaleMode = 3 End Sub
' процедура вычерчивает вектор заданной длины из точки (x0,y0) Sub Vector(x0 As Integer, y0 As Integer, _ a As Integer, l As Integer) ' x0, y0 - начало вектора ' a - угол между осью X и вектором ' l - длина вектора Dim x, y As Integer ' координаты конца вектора
x = Round(x0 + l * Cos(a * GRAD)) y = Round(y0 - l * Sin(a * GRAD)) Line (x0, y0)-(x, y) End Sub
' процедура рисует стрелки Sub DrawClock() ' шаг секундной и минутной стрелок 6 градусов, ' часовой - 30.
' стирание изображений стрелок Form1.DrawWidth = 3 ' задание толщины линии Form1.ForeColor = Form1.BackColor ' часовая стрелка Call Vector(x0, y0, ahr, R - 20) ' минутная стрелка Call Vector(x0, y0, amin, R - 15) ' секундная стрелка Call Vector(x0, y0, asec, R - 7)
' определение нового положения стрелок ahr = 90 - Hour(Time) * 30 - (Minute(Time) / 12) * 6 amin = 90 - Minute(Time) * 6 asec = 90 - Second(Time) * 6 ' прорисовка стрелок на новом положении ' часовая стрелка Form1.DrawWidth = 3 Form1.ForeColor = RGB(0, 0, 0) Call Vector(x0, y0, ahr, R - 20) ' минутная стрелка Form1.DrawWidth = 2 Call Vector(x0, y0, amin, R - 15) ' секундная стрелка Form1.DrawWidth = 1 Form1.ForeColor = RGB(200, 0, 0) Call Vector(x0, y0, asec, R - 7) End Sub
' прорисовка циферблата и начальных стрелок Private Sub Form_Paint() Dim x As Integer ' координаты маркера Dim y As Integer ' на циферблате Dim a As Integer ' угол между осью X и ' прямой (x0, y0) - (x, y) Dim h As Integer ' метка часовой риски
Form1.DrawWidth = 1 Form1.ForeColor = RGB(0, 0, 0)
a = 0 ' метки ставим от 3-х часов, против ' часовой стрелки h = 3 ' угол 0 градусов - это 3 часа
' циферблат While (a < 360) x = x0 + Round(R * Cos(a * 2 * PI / 360)) y = x0 - Round(R * Sin(a * 2 * PI / 360)) If (a Mod 30) = 0 Then Circle (x, y), 2 ' вывод цифр по большему радиусу CurrentX = x0 + Round((R + 15) * _ Cos(a * 2 * PI / 360)) - 7 CurrentY = x0 - Round((R + 15) * _ Sin(a * 2 * PI / 360)) - 7 Print h h = h - 1 If h = 0 Then h = 12 Else: Circle (x, y), 1 End If a = a + 6 ' 1 минута - 6 градусов Wend Call DrawClock End Sub
' прорисовка текущих положений стрелок часов Private Sub Timer1_Timer() Call DrawClock End Sub |
На форме должен быть таймер. В общем-то идея проста - радиус-вектор бежит по окружности с интервалом в 1 с.
--------------------
i_i (';') (V) 
|