Imports System.Drawing.Drawing2D
Imports System.Drawing.Text
Public Class Form2
Const WinkTimerInterval As Integer = 150 ' En milisegundos
Protected eyeImages(6) As Image
Protected currentImage As Integer = 0
Protected animationStep As Integer = 1
Const BallTimerInterval As Integer = 25 ' En milisegundos
Private ballSize As Integer = 16 ' Como una fracción del área de cliente
Private moveSize As Integer = 4 ' Como una fracción del tamaño de la pelota
Private bitmap As Bitmap
Private ballPositionX As Integer
Private ballPositionY As Integer
Private ballRadiusX As Integer
Private ballRadiusY As Integer
Private ballMoveX As Integer
Private ballMoveY As Integer
Private ballBitmapWidth As Integer
Private ballBitmapHeight As Integer
Private bitmapWidthMargin As Integer
Private bitmapHeightMargin As Integer
Const TextTimerInterval As Integer = 15 ' En milisegundos
Protected currentGradientShift As Integer = 10
Protected gradiantStep As Integer = 5
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
eyeImages(0) = My.Resources.dorita
eyeImages(1) = My.Resources.bwall58
eyeImages(2) = My.Resources.dorita
eyeImages(3) = My.Resources.aioros
eyeImages(4) = My.Resources.assasain
eyeImages(5) = My.Resources.bwall58
End Sub
Private Sub exitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles exitToolStripMenuItem.Click
Me.Close()
End Sub
Private Sub optWink_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optWink.CheckedChanged
If optWink.Checked Then
tmrAnimation.Interval = WinkTimerInterval
ElseIf optBall.Checked Then
tmrAnimation.Interval = BallTimerInterval
ElseIf optText.Checked Then
tmrAnimation.Interval = TextTimerInterval
End If
OnResize(EventArgs.Empty)
End Sub
Private Sub optBall_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optBall.CheckedChanged
If optWink.Checked Then
tmrAnimation.Interval = WinkTimerInterval
ElseIf optBall.Checked Then
tmrAnimation.Interval = BallTimerInterval
ElseIf optText.Checked Then
tmrAnimation.Interval = TextTimerInterval
End If
OnResize(EventArgs.Empty)
End Sub
Protected Overrides Sub OnResize(ByVal ea As EventArgs)
If optWink.Checked Then
' Obtenga el objeto Graphics expuesto por el formulario y borre todos los dibujos.
Dim grfx As Graphics = CreateGraphics()
' También puede llamar a grfx.Clear(BackColor) o Me.Invalidate() para borrar
' la pantalla.
Me.Refresh()
grfx.Dispose()
ElseIf optBall.Checked Then
' Obtenga el objeto Graphics expuesto por el formulario y borre todos los dibujos.
Dim grfx As Graphics = CreateGraphics()
grfx.Clear(BackColor)
' Defina el radio de la pelota en una fracción del ancho o el alto
' del área de cliente, el que sea menor.
Dim dblRadius As Double = Math.Min(ClientSize.Width / grfx.DpiX, _
ClientSize.Height / grfx.DpiY) / ballSize
' Defina el ancho y el alto de la pelota, ya que normalmente el DPI es
' idéntico en los ejes X e Y.
ballRadiusX = CInt(dblRadius * grfx.DpiX)
ballRadiusY = CInt(dblRadius * grfx.DpiY)
grfx.Dispose()
' Defina la distancia que recorre la pelota en 1 píxel o en una fracción del
' tamaño de la pelota, lo que sea mayor. De esta forma, la distancia que
' recorre la pelota cada vez que se dibuja será proporcional a su tamaño que,
' a su vez, será proporcional al tamaño del área de cliente. Por tanto, cuando
' el área de cliente se reduce, disminuye la velocidad de la pelota, y cuando
' aumenta, se incrementa la velocidad de la pelota.
ballMoveX = CInt(Math.Max(1, ballRadiusX / moveSize))
ballMoveY = CInt(Math.Max(1, ballRadiusY / moveSize))
'Observe que el valor del movimiento de la pelota sirve también como
' margen en torno a la pelota, que determina el tamaño del mapa de bits
' real en el que se dibuja la pelota. Por tanto, la distancia recorrida por la pelota
' es exactamente igual al tamaño del mapa de bits, lo que permite borrar
' la imagen anterior de la pelota antes de que se dibuje la siguiente imagen, y
' todo ello sin que se produzca un parpadeo excesivo.
bitmapWidthMargin = ballMoveX
bitmapHeightMargin = ballMoveY
' Determine el tamaño real del mapa de bits en el que se dibuja la pelota
' agregando los márgenes a las dimensiones de la pelota.
ballBitmapWidth = 2 * (ballRadiusX + bitmapWidthMargin)
ballBitmapHeight = 2 * (ballRadiusY + bitmapHeightMargin)
' Cree un nuevo mapa de bits pasando el ancho y el alto
bitmap = New Bitmap(ballBitmapWidth, ballBitmapHeight)
' Obtenga el objeto Graphics expuesto por el mapa de bits, limpie la pelota
' existente y dibuje la nueva pelota.
grfx = Graphics.FromImage(bitmap)
With grfx
.Clear(BackColor)
.FillEllipse(Brushes.Red, New Rectangle(ballMoveX, _
ballMoveY, 2 * ballRadiusX, 2 * ballRadiusY))
.Dispose()
End With
' Restablezca la posición de la pelota en el centro del área de cliente.
ballPositionX = CInt(ClientSize.Width / 2)
ballPositionY = CInt(ClientSize.Height / 2)
ElseIf optText.Checked Then
' Obtenga el objeto Graphics expuesto por el formulario y borre todos los dibujos.
Dim grfx As Graphics = CreateGraphics()
grfx.Clear(BackColor)
End If
End Sub
Private Sub tmrAnimation_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrAnimation.Tick
If optWink.Checked Then
' Obtenga el objeto Graphics expuesto por el formulario.
Dim grfx As Graphics = CreateGraphics()
' Llame a DrawImage, mediante Overload #8, que obtiene la imagen actual para su
' presentación, las coordenadas X e Y (que, en este caso, centra la
' imagen en el área de cliente) y el ancho y alto de la imagen.
grfx.DrawImage(eyeImages(currentImage), _
CInt((ClientSize.Width - eyeImages(currentImage).Width) / 2), _
CInt((ClientSize.Height - eyeImages(currentImage).Height) / 2), _
eyeImages(currentImage).Width, _
eyeImages(currentImage).Height)
' Es aconsejable que siempre se llame a Dispose para los objetos que exponen este
' método, en lugar de esperar a que el recolector de elementos no utilizados se ejecute automáticamente.
' De esta forma, obtendrá siempre un mayor rendimiento de la aplicación.
grfx.Dispose()
' Recorra en bucle las imágenes.
currentImage += animationStep
If currentImage = 5 Then
' Ésta es la última imagen de las cuatro, por lo que debe invertir el orden de
' animación .
animationStep = -1
ElseIf currentImage = 0 Then
' Ésta es la primera imagen , por lo que debe invertir el orden de
' animación
animationStep = 1
End If
ElseIf optBall.Checked Then
' Obtenga el objeto Graphics expuesto por el formulario.
Dim grfx As Graphics = CreateGraphics()
' Dibuje el mapa de bits que contiene la pelota en el formulario.
grfx.DrawImage(bitmap, _
CInt(ballPositionX - ballBitmapWidth / 2), _
CInt(ballPositionY - ballBitmapHeight / 2), _
ballBitmapWidth, ballBitmapHeight)
grfx.Dispose()
' Aumente la posición de la pelota en la distancia que se ha
' movido en las coordenadas X e Y después de haber sido redibujada.
ballPositionX += ballMoveX
ballPositionY += ballMoveY
' Invierta la dirección de la pelota cuando toque un extremo.
If ballPositionX + ballRadiusX >= ClientSize.Width _
Or ballPositionX - ballRadiusX <= 0 Then
ballMoveX = -ballMoveX
Beep()
End If
' Defina el extremo Y en 80 en lugar de en 0 para que la pelota no rebote
' en los controles del formulario.
If ballPositionY + ballRadiusY >= ClientSize.Height _
Or ballPositionY - ballRadiusY <= 80 Then
ballMoveY = -ballMoveY
Beep()
End If
ElseIf optText.Checked Then
' Obtenga el objeto Graphics expuesto por el formulario.
Dim grfx As Graphics = CreateGraphics()
' Defina el tipo de fuente, el texto y determine su tamaño.
Dim font As New Font("Microsoft Sans Serif", 96, _
FontStyle.Bold, GraphicsUnit.Point)
Dim strText As String = "Javier_Vidarte_Delgado "
Dim sizfText As New SizeF(grfx.MeasureString(strText, font))
' Defina el punto en el que se va a dibujar el texto: centrado
' en el área de cliente.
Dim ptfTextStart As New PointF( _
CSng(ClientSize.Width - sizfText.Width) / 2, _
CSng(ClientSize.Height - sizfText.Height) / 2)
' Defina el punto inicial y final de inclinación; este último se ajustará
' mediante un valor cambiante para producir el efecto de animación.
Dim ptfGradientStart As New PointF(0, 0)
Dim ptfGradientEnd As New PointF(currentGradientShift, 200)
' Cree una instancia del pincel utilizado para dibujar el texto.
Dim grBrush As New LinearGradientBrush(ptfGradientStart, _
ptfGradientEnd, Color.Blue, BackColor)
' Dibuje el texto centrado en el área de cliente.
grfx.DrawString(strText, font, grBrush, ptfTextStart)
grfx.Dispose()
' Mueva la inclinación e inviértala cuando obtenga un determinado valor.
currentGradientShift += gradiantStep
If currentGradientShift = 500 Then
gradiantStep = -5
ElseIf currentGradientShift = -50 Then
gradiantStep = 5
End If
End If
End Sub
End Class