Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Аналоговые часы


Автор: morpheuz 2.6.2006, 17:37
Возникла проблема с этим. Цифровые часы написать легко. Не могу сделать стрелочные, перебрал многие исходники - не работают, вылазят ошибки. smile Помогите как это сделать.  Или покажите ссылку на РАБОЧИЙ исходник, пожалуйста.  

Автор: Akina 2.6.2006, 17:42
Я не понял - ты хочешь вот так прямо готовые, что ли? нет? тогда в чем проблема? время получить? стрелки нарисовать?

 

Автор: Дмит 2.6.2006, 21:35
http://dimit.pochta.ru/excel/clocks.zip посмотри 

Автор: morpheuz 3.6.2006, 10:31
Мне не стрелочки нужны, не рисынки - а что бы линия премещалась, и циферблат... Но цифры на нем по ходу картинки- иначе же никак? И еще как сделать, что бы эта стрелочка перемежалась с реальынм временем, а не по кнопке старт... неи как связать эту линию-стрелку с таймером? 

Автор: morpheuz 4.6.2006, 19:07
никто не может дать нормальный исходник?smile я запарился писать их... smile а зачет послезавтра smile 

Автор: cardinal 4.6.2006, 19:42
http://www.codetoad.com/vb_clock.asp 

Автор: Voldemar2004 4.6.2006, 20:26
Взято из книжки "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 с. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)