Un Reloj Como UserControl Fecha: 17/Feb/2005 (13/02/2005)
|
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 ClassAca esta la Imagen del Relojito
Espacios de nombres usados en el código de este artículo:
System.Drawing.Drawing2D
System.Drawing
System.Math