Expertos en el desarrollo de programas de reloj simples en vb.net, ¡ayúdenme!
¡Es
esto
!
Código de clase de mano:
Clase pública MustInherit Hand
Gp protegido como GraphicsPath = New GraphicsPath()
GpBase protegido como GraphicsPath = Nada
Protegido midX As Integer = 150 'Formulario predeterminado
Protegido midY As Integer = 150 'Posición central
' constructor, obtiene el formulario Posición central p>
Sub público nuevo(ByVal theForm As Form1)
midX = (theForm.ClientRectangle.Left + theForm.ClientRectangle.Right) / 2
midY = (theForm. ClientRectangle.Top + theForm.ClientRectangle.Bottom) / 2
End Sub
MustOverride Sub Transform(ByVal d As DateTime)
'Dibujar ruta del puntero p>
Sub Draw anulable (ByVal g As Graphics)
Atenuar aPen As Pen = New Pen(Brushes.Black, 4F)
g.DrawPath( aPen, gp)
g.FillPath(Brushes.Black, gp)
aPen.Dispose()
End Sub
' Utilice una matriz para rotar la ruta (gp)
Sub Rotación pública (ángulo ByVal como doble)
gp = CType(gpBase.Clone(), GraphicsPath)
Dim mTransform As Matrix = New Matrix()
mTransform.RotateAt(CType(angle,Single),NewPointF(midX,midY))
gp.Transform(mTransform)
p >End Sub
End Class
Para ahorrar espacio, el código anterior omite la declaración que introduce el espacio de nombres.
La siguiente es la definición de la clase de minutero (MinuteHand):
Clase pública MinuteHand
Hereda la mano
'Constructor, genera el dibujo del minutero Ruta (gp)
Public Sub New(ByVal myForm As Form1)
MyBase.New(myForm)
gp.AddLine(midX, midY, midX, 45)
gp.AddLine(midX, 45, midX - 3, 50)
gp.AddLine(midX - 3, 50, midX + 3, 50)
gp.AddLine(midX + 3, 50, midX, 45)
gpBase = CType(gp.Clone(), GraphicsPath)
End Sub
'El método de transformación obtiene la hora actual del sistema y gira el puntero del reloj.
Subtransformación de anulaciones públicas (ByVal d As DateTime)
Dim MinuteTime As Double = (CDbl(d.Minute) + CDbl(d.Second / 60))
Atenuar ángulo como doble = (CDbl(minutoTiempo) / 60) * 360
Girar(ángulo)
Fin Sub
Fin Clase
El método de rotación de punteros es el mismo para todos los punteros, por lo que se implementa en la clase base. Dado que la implementación de las manecillas de las horas y los segundos es similar a la del minutero, la única diferencia es que la ruta del puntero dibujada en el constructor es diferente y el ángulo de rotación en el método Transform es diferente, por lo que no iré en detalles aquí.
Otra cosa que hay que mencionar es el código para dibujar la esfera del reloj. La esfera del reloj se implementa utilizando la clase ClockFace. Esta clase primero dibuja un círculo para representar el reloj, luego dibuja un patrón de Mickey Mouse y finalmente dibuja los números del 1 al 12 en las posiciones correspondientes para representar 12 horas.
Subdibujo público (PorVal g como gráficos)
DrawClockFace(g)
DrawImage(g)
DrawNumbers(g)
DrawPin(g)
End Sub
Las siguientes son las propiedades de la clase ClockFace:
Private ClockRectangle As rectángulo
Fuente de reloj privada como fuente = Nueva fuente("Arial", 12)
Punto medio privado como punto
Imagen de reloj privada como mapa de bits
IMAGEN constante privada As Integer = 50
Private Const IMAGEY As Integer = 50
El método DrawClockFace se utiliza para dibujar la superficie del reloj:
Private Sub DrawClockFace(ByVal g As Graphics )
g.FillEllipse(Brushes.White, ClockRectangle.Left + 10, ClockRectangle.Top + 10, ClockRectangle.Width - 20, ClockRectangle.Height - 20)
g.DrawEllipse (Pens.Black, ClockRectangle.Left + 10, ClockRectangle.Top + 10, ClockRectangle.Width - 20, ClockRectangle.Height - 20)
End Sub
Luego usa el método DrawImage del objeto Graphics para dibujar la imagen del mouse:
Private Sub DrawImage(ByVal g As Graphics)
Dim nWidth As Integer = ClockImage.Width
Atenuar nHeight como entero = ClockImage.Height
Atenuar destRect como rectángulo = Nuevo rectángulo(midPoint.X - IMAGEX / 2, midPoint.Y - IMAGEY / 2, IMAGEX, IMAGEY)
g.DrawImage(ClockImage, destRect)
End Sub
La posición del número en el reloj se calcula usando las funciones sin y cos:
Privado Sub DrawNumbers(ByVal g As Graphics)
Atenuar recuento como entero = 1
Atenuar a como doble
Para a = 0 a 2 * Paso Math.PI 2 * Math.PI / 12
Dim x As Double = (ClockRectangle.Width - 70) / 2 * Math.Cos(a - Math.PI / 3) + (ClockRectangle.Width - 70) / 2 + 25
Atenuar yAs
Doble = (ClockRectangle.Width - 70) / 2 * Math.Sin(a - Math.PI / 3) + (ClockRectangle.Width - 70) / 2 + 20
g.DrawString(Convert.ToString (recuento), ClockFont, Brushes.Black, CType(x, Single), CType(y, Single), New StringFormat())
count += 1
Siguiente p>
Siguiente
p>
End Sub
El último es el archivo de formulario (Form1.vb):
Clase pública Form1
Hereda System.Windows.Forms.Form
Privar MyMinuteHand como MinuteHand
Privar MyHourHand como HourHand
Privar MySecondHand como SecondHand
Private TheClockFace As ClockFace
Private FirstTick As Boolean = False
'Obtener el objeto Graphics en el evento OnPaint del formulario
Anulaciones protegidas Sub OnPaint( ByVal e As System.Windows.Forms.PaintEventArgs)
p>Si (FirstTick = False) Entonces salga de Sub
Dim g As Graphics = e.Graphics
TheClockFace.Draw(g)
MyHourHand .Draw(g)
MyMinuteHand.Draw(g)
MySecondHand.Draw(g)
TheClockFace.DrawPin(g)
End Sub
'Evento del temporizador
Private Sub Timer1_Tick(ByVal remitente As System.Object, ByVal e As System .EventArgs) maneja Timer1.Tick
MySecondHand.Transform(DateTime.Now)
MyHourHand.Transform(DateTime.Now)
MyMinuteHand.Transform(DateTime. Ahora)
FirstTick = True
p>
Invalidate()