Red de conocimiento informático - Problemas con los teléfonos móviles - Expertos en el desarrollo de programas de reloj simples en vb.net, ¡ayúdenme!

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

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

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

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()