HELP. Отслеживание изменений времени и даты. - VB
Формулировка задачи:
HIHI FRDS.
Возникла необходимость отслеживать изменение системного времени и даты. Причем не изменение через Control Panel --> Data/Time, а именно изменение времени. Например, изменилась минута - возникло событие MinChange. Если изменился час - возникло событие HourChange. Точно так же для даты, месяца и года.
Я понимаю, что можно поставить Timer и каждые n секунд проверять Time and Date. Но может быть есть другие более красивые способы ?
Thank you for answers in your time in advance.
Regards,
Andy.
removed@mail.ru
Решение задачи: «HELP. Отслеживание изменений времени и даты.»
textual
Листинг программы
Imports System.Drawing
Public Class Clock
Dim blnInitiate As Boolean
Dim secPast, secPresent As UShort 'secPast - значение секунд одну милисекуднду назад, а secPresent текущее значение секунд.
Dim CurrentTime, TimeSplit() As String
Dim angleSec, AngleMin, AngleHour As UShort
Dim w, h As Single
Dim x, y, x2, y2, x3, y3, xPnt, yPnt As Single
Dim xB, yB, xB2, yB2, xB3, yB3 As Single
Dim Gra As Graphics = MyBase.CreateGraphics
Private Sub Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer.Tick
w = Me.Size.Width
h = Me.Size.Height
CurrentTime = System.DateTime.Now.ToLongTimeString
CurrentTime &= ":" & System.DateTime.Now.Millisecond.ToString
TimeSplit = CurrentTime.Split(":")
'Задание секунд
angleSec = TimeSplit(2) * 6 + (TimeSplit(3) / 1000) * 6
'Задание минут
AngleMin = TimeSplit(1) * 6
'Задание часа
'AngleHour = TimeSplit(0) * 30
AngleHour = TimeSplit(0) * 30 + (30 * (AngleMin / 360))
TextBox1.Text = System.DateTime.Now.ToLongTimeString & ":" & System.DateTime.Now.Millisecond.ToString
secPresent = System.DateTime.Now.Second + (TimeSplit(3) / 1000) * 6
'Рисование стрелок
If secPast <> secPresent Or blnInitiate = True Then
Me.Refresh()
'Вычисление координат секундной стрелки
'координаты конца
x = 75 * Math.Sin(angleSec * Math.PI / 180)
y = 75 * Math.Cos(angleSec * Math.PI / 180)
'координаты начала (получется как бы хвостик у стрелочки длиной в 15 пикселей)
xB = 15 * Math.Sin((angleSec + 180) * Math.PI / 180)
yB = 15 * Math.Cos((angleSec + 180) * Math.PI / 180)
'Рисование секундной стрелки
Gra.DrawLine(Pens.Blue, xB + w / 2, yB * (-1) + h / 2, x + w / 2, y * (-1) + h / 2)
'Вычисление координат минутной стрелки
'координаты конца
x2 = 65 * Math.Sin(AngleMin * Math.PI / 180)
y2 = 65 * Math.Cos(AngleMin * Math.PI / 180)
'координаты начала (получется как бы хвостик у стрелочки длиной в 13 пикселей)
xB2 = 13 * Math.Sin((AngleMin + 180) * Math.PI / 180)
yB2 = 13 * Math.Cos((AngleMin + 180) * Math.PI / 180)
'Рисование минутной стрелки
Gra.DrawLine(Pens.Green, xB2 + w / 2, yB2 * (-1) + h / 2, x2 + w / 2, y2 * (-1) + h / 2)
'Вычисление координат часовой стрелки
'координаты конца
x3 = 50 * Math.Sin(AngleHour * Math.PI / 180)
y3 = 50 * Math.Cos(AngleHour * Math.PI / 180)
'координаты начала (получется как бы хвостик у стрелочки длиной в 10 пикселей)
xB3 = 10 * Math.Sin((AngleHour + 180) * Math.PI / 180)
yB3 = 10 * Math.Cos((AngleHour + 180) * Math.PI / 180)
'Рисование часовой стрелки
Gra.DrawLine(Pens.Red, xB3 + w / 2, yB3 * (-1) + h / 2, x3 + w / 2, y3 * (-1) + h / 2)
blnInitiate = False
End If
secPast = System.DateTime.Now.Second + (TimeSplit(3) / 1000) * 6
End Sub
Private Sub Clock_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
blnInitiate = True
Me.Top = 60 : Me.Left = Screen.PrimaryScreen.WorkingArea.Width - Me.Width - 60
Me.DoubleBuffered = True
End Sub
Private Sub Clock_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
w = Me.Size.Width
h = Me.Size.Height
'Рисование фона
Gra.FillEllipse(Brushes.CornflowerBlue, w / 2 - 75, h / 2 - 75, 150, 150)
Gra.DrawEllipse(Pens.Black, w / 2 - 75, h / 2 - 75, 150, 150)
'Рисование засечек и цифр на циферблате
For i = 30 To 360 Step 30
xPnt = 65 * Math.Sin(i * Math.PI / 180)
yPnt = 65 * Math.Cos(i * Math.PI / 180)
'рисование цифр (цифры 1-9 и 10-12 рисуются отдельно, т.к. у них разная ширина, а значит и смещение по x влево разное, чтобы они были по середине)
If i >= 30 And i <= 270 Then
Gra.DrawString(i / 30, Font, Brushes.Black, xPnt + w / 2 - 5, yPnt * (-1) + h / 2 - 6) 'рисование цифр 1-9
Else
Gra.DrawString(i / 30, Font, Brushes.Black, xPnt + w / 2 - 8, yPnt * (-1) + h / 2 - 6) 'рисование цифр 10-12
End If
xPnt = 75 * Math.Sin(i * Math.PI / 180)
yPnt = 75 * Math.Cos(i * Math.PI / 180)
Gra.FillEllipse(Brushes.Black, xPnt + w / 2 - 2, yPnt * (-1) + h / 2 - 2, 4, 4)
Next i
End Sub
Private Sub FirstItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FirstItem.Click
'контекстное меню кнопка "скрыть/показать"
If FirstItem.Text = "Скрыть" Then
Me.Hide()
FirstItem.Text = "Показать"
Else
Me.Show()
FirstItem.Text = "Скрыть"
End If
End Sub
Private Sub SecondItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SecondItem.Click
'контекстное меню кнопка "выход"
Me.Close()
End Sub
End Class