entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Imagen moviendose en pantalla a tiempo real VB.NET

Hola un saludo

Me encuentro desarrollando un práctica de simulación de protector de pantalla.
Requiero mover en el formulario de mi programa una imagen, un picturebox en concreto:

enter image description here

Bien ahora, sé que puedo cambiar la localización de la imagen con .location tanto en eje x, y ; quiero mover la imagen hasta que llegue al borde, que en mi caso seria (666,0) osea que choca con el borde derecho en el pixel 666 del formulario.
Lo que pasa es que quiero ver que vaya cambiando de posición y para ello establezco mis variables X,Y y voy comparándolas, mientras que X no sea 666, aumento a X = X+1 y asigno la nueva localización : New point (X,Y).
El problema es que el programa ejecuta todo ésto de inmediato y no lo muestra, quiero que vaya ejecutando el cambio de localización y poder verlo. Para ésto quise hacer una pausa en pantalla de milisegundos con threading.sleep, pero no se que ocurre que el formulario pasado dos segundos se paraliza.

Usé un timer para que pasado 2 segundos empezara a ejecutar el código para mover la imágen.
Mi código :

Public Class Form1
    Public x As Integer
    Public y As Integer

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        x = 0
        y = 0
        'iniciar la imagen en 0,0
        pictureAstro.Location = New Point(x, y)
        'Agregar la transparencia y que pueda verse encima el astro
        PictureBox1.Controls.Add(pictureAstro)

        'Establecemos el intervalo de tiempo para que inicie el evento
        Timer1.Interval = 2000 '2segundos
        Timer1.Start()
    End sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        'Pasado el tiempo empezamos a mover la imagen
        'Mover la imagen hasta chocar con borde en eje x 666
        While x <> 666
            x = x + 1
            pictureAstro.Location = New Point(x, y)
            System.Threading.Thread.Sleep(100)
        End While
    End Sub

End class

Hay alguna idea de como solucionarlo ó como poder desplazar la imágen y ver el cambio de posición en tiempo real?

1 Respuesta

1voto

carlossevi Puntos63580

Creo que la solución a tu problema es la función Application.DoEvents. Te copio parte de la documentación:

Cada vez que el formulario controla un evento, procesa todo el código asociado al evento. Todos los demás eventos esperan en la cola. Aunque su código controle el evento, la aplicación no responde. Por ejemplo, la ventana no vuelve a dibujarse si se arrastra otra ventana en la parte superior.

Si se llama a DoEvents en el código, la aplicación puede controlar los demás eventos. Por ejemplo, si tiene un formulario que agrega datos a una ListBox y agregue DoEvents a su código, el formulario se vuelve a dibujar cuando se arrastra otra ventana sobre él. Si quita DoEvents desde el código, el formulario no se volverá a dibujar hasta que termine el controlador de eventos click del botón ejecutar. Para obtener más información acerca de la mensajería, consulte Datos proporcionados por el usuario en formularios Windows Forms.

Prueba a añadir la siguiente línea antes del Sleep:

Application.DoEvents()

1voto

Dr oscar comentado

Vaya si funcionó :D

Sólo aclara en tu respuesta que se debia añadir asi :

Application.DoEvents()
System.Threading.Thread.Sleep(100)

Porque creí que había que meterla en los paréntesis del sleep..
En fin, muchas gracias :D

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta