Un Reloj Como UserControl

Fecha: 17/Feb/2005 (13/02/2005)
Autor: Marcos Donalisio (marcos_donalisio@hotmail.com)

 


Este es un Control que Cree, es un Reloj de Aguja Parecido al que viene con Windows, nada mas que es mas simple y tiene mas colores.

Lo Hice con un Metodo de DobleBuffer (Que encontre en esta SuperPagina) para evitar el Parpadeo, porque no sabia como se asia, bueno ahora paso a explicar como hice el Control

la Clase Reloj Cuenta con Propiedad Para Setear La Hora, Los Minutos, y Los Segundos. y Otra Propiedad para setear Todo con un String del Formato hh:mm:ss que se puede obtener directamente de la Clase Date.Now.ToLongTimeString

Lo Otro importante es el Calculo de Giro de las Agujas donde para esto use las funciones de la Clase Math que son Seno y Coseno, entonces la posicion Y la Calculo con el Coseno de un Numero Pasado por Parametro por 6, se preguntaran de donde saco el 6, Facil, en 60 Minutos o Segundos la Aguja hace un Giro Completo, osea, 360 Grados, entonces si dividimos 360 sobre 60 nos da 6, esto quiere decir que la Aguja Gira 6 grados cada 1 Minuto. Por la Misma razon en donde se calcula la Hora se multiplica por 30 debido a que la Aguja de la Hora hace un giro cada 12 Horas, entonces si hacemos 360 dividido 12 nos da 30

saben cuanto estuve para hacer esto, todo un dia, saben porque, porque la calculadora me daba los Grados en DEG y la Compu me lo Calculaba en RAD, que detalle, pero lo pude solucionar, y aca esta mi control

Imports System.Drawing.Drawing2D
Imports System.Drawing
Imports System.Math

Public Class Reloj
   Inherits System.Windows.Forms.UserControl

#Region " Código generado por el Diseñador de Windows Forms "

   Public Sub New()
      MyBase.New()

      'El Diseñador de Windows Forms requiere esta llamada.
      InitializeComponent()

      'Agregar cualquier inicialización después de la llamada a InitializeComponent()

   End Sub

   'UserControl reemplaza a Dispose para limpiar la lista de componentes.
   Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
      If disposing Then
         If Not (components Is Nothing) Then
            components.Dispose()
         End If
      End If
      MyBase.Dispose(disposing)
   End Sub

   'Requerido por el Diseñador de Windows Forms
   Private components As System.ComponentModel.IContainer

   'NOTA: el Diseñador de Windows Forms requiere el siguiente procedimiento
   'Puede modificarse utilizando el Diseñador de Windows Forms. 
   'No lo modifique con el editor de código.
   <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
      '
      'Tacometro
      '
      Me.BackColor = System.Drawing.SystemColors.Control
      Me.Enabled = False
      Me.ForeColor = System.Drawing.SystemColors.ControlText
      Me.Name = "Tacometro"
      Me.Size = New System.Drawing.Size(200, 200)

   End Sub

#End Region

   Private Min_x, Sec_x, Hora_x As Single
   Private Min_y, Sec_y, Hora_y As Single
   Private value_s, value_h, value_m As Single

   Dim grafico As Graphics = Me.CreateGraphics
   Dim image As Bitmap
   Dim graficoBuffer As Graphics
   Dim colorFondo As Color

   Dim MyHora, value_hor As String

   Private Sub dibujar() ' Este metodo se encarga de Dibujar en el Control
      Borrar()
      Dim br As Brush
      br = New SolidBrush(Color.Black)

      graficoBuffer.DrawEllipse(New Pen(Color.Yellow, 5), 20, 20, 160, 160)

      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 100, 10, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 100, 190, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 10, 100, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 190, 100, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 22, 55, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 55, 22, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 22, 145, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 55, 180, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 180, 145, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 145, 180, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 145, 22, 2, 2)
      graficoBuffer.DrawEllipse(New Pen(Color.Green, 2), 180, 55, 2, 2)

      graficoBuffer.DrawString("1", New Font("Verdana", 20, FontStyle.Bold), br, 120, 25)
      graficoBuffer.DrawString("2", New Font("Verdana", 20, FontStyle.Bold), br, 145, 50)
      graficoBuffer.DrawString("3", New Font("Verdana", 20, FontStyle.Bold), br, 155, 82)
      graficoBuffer.DrawString("4", New Font("Verdana", 20, FontStyle.Bold), br, 145, 115)
      graficoBuffer.DrawString("5", New Font("Verdana", 20, FontStyle.Bold), br, 125, 140)
      graficoBuffer.DrawString("6", New Font("Verdana", 20, FontStyle.Bold), br, 90, 150)
      graficoBuffer.DrawString("7", New Font("Verdana", 20, FontStyle.Bold), br, 55, 140)
      graficoBuffer.DrawString("8", New Font("Verdana", 20, FontStyle.Bold), br, 30, 115)
      graficoBuffer.DrawString("9", New Font("Verdana", 20, FontStyle.Bold), br, 20, 82)
      graficoBuffer.DrawString("10", New Font("Verdana", 20, FontStyle.Bold), br, 20, 50)
      graficoBuffer.DrawString("11", New Font("Verdana", 20, FontStyle.Bold), br, 45, 25)
      graficoBuffer.DrawString("12", New Font("Verdana", 20, FontStyle.Bold), br, 80, 15)

      graficoBuffer.DrawLine(New Pen(Color.Orange, 3), 100, 100, Min_x, Min_y)
      graficoBuffer.DrawLine(New Pen(Color.Red, 3), 100, 100, Hora_x, Hora_y)
      graficoBuffer.DrawLine(New Pen(Color.Violet, 1), 100, 100, Sec_x, Sec_y)

      grafico.DrawImage(image, 0, 0)
      Actualizar()
   End Sub
   Public Sub Borrar()
      'Borro el Buffer para pintar la Imagen Actualizada
      graficoBuffer.Clear(colorFondo)
   End Sub
   Public Sub Actualizar()
      'Actualizo el Dibujo
      grafico.DrawImage(image, 0, 0)
   End Sub

   Public Property Horas() As Single 'Aca Toma el Valor de las Horas
      Get
         Return value_h
      End Get
      Set(ByVal Value As Single)
         'Aca Calculo los puntos del extremo de la Manecilla que marca la Hora
         Dim num1 As Single = ((Value * 30) * 0.017453292) + Me.Minutos / 120
         Me.Hora_y = CSng(-(Math.Cos(num1) * 50) + 100)
         Me.Hora_x = CSng((Math.Sin(num1) * 50) + 100)
         Me.value_h = Value
         dibujar()
      End Set
   End Property

   Public Property Minutos() As Single 'Aca Toma el Valor de los Minutos
      Get
         Return value_m
      End Get
      Set(ByVal Value As Single)
         'Aca Calculo los puntos del extremo de la Manecilla que marca los Minutos
         Dim num1 As Single = (Value * 6) * 0.017453292
         Me.Min_y = CSng(-(Math.Cos(num1) * 70) + 100)
         Me.Min_x = CSng((Math.Sin(num1) * 70) + 100)
         Me.value_m = Value
         dibujar()
      End Set
   End Property

   Public Property Segundos() As Single 'Aca Toma el Valor de los Segundos
      Get
         Return value_s
      End Get
      Set(ByVal Value As Single)
         'Aca Calculo los puntos del extremo de la Manecilla que marca los Segundos
         Dim num1 As Single = (Value * 6) * 0.017453292
         Me.Sec_y = CSng(-(Math.Cos(num1) * 70) + 100)
         Me.Sec_x = CSng((Math.Sin(num1) * 70) + 100)
         Me.value_s = Value
         dibujar()
      End Set
   End Property

   Public Property setMyHoras() As String 'Aca Se Asigna la Hora Como Un String del Formato hh:mm:ss
      Get
         Return value_hor
      End Get
      Set(ByVal Value As String)
         Me.value_hor = Value
         Dim separator(2) As Char
         ' Aca Creo Los Arrays 1 de Caracteres que contiene el Caracter ":"
         ' y otro Para que contenga La Hora, Los Minutos, Los Segundos
         separator(0) = New Char
         separator(0) = ":"
         separator(1) = New Char
         separator(1) = ":"
         Dim hor() As String
         hor = Value.Split(separator(0))
         Dim H As String = hor(0)
         Dim M As String = hor(1)
         Dim S As String = hor(2)

         Me.Horas = CSng(H) 'Asigno la Hora
         Me.Minutos = CSng(M) 'Asigno los Minutos
         Me.Segundos = CSng(S) 'Asigno Los Segundos
         dibujar() 'y Dibujo
      End Set
   End Property

   Private Sub Reloj_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
      grafico = Me.CreateGraphics
      image = New Bitmap(200, 200)
      graficoBuffer = grafico.FromImage(image)
      colorFondo = Me.BackColor
      Me.Width = 200
      Me.Height = 200
      Me.setMyHoras = "12:12:12"
   End Sub

End Class

Aca esta la Imagen del Relojito


Espacios de nombres usados en el código de este artículo:

System.Drawing.Drawing2D
System.Drawing
System.Math

 


ir al índice