none
como hago para que pase algo si un picturebox toca el borde del form RRS feed

  • Pregunta

  • tengo un juego que consiste en arrastrar un picturebox y llevarlo hasta la meta, como hago que pase algo (msgbox("perdiste")) cuando el picture toque un borde del form
    miércoles, 24 de junio de 2009 20:28

Respuestas

  • Sustituye el código que te indiqué para averiguar la intersección de los dos rectángulos, por éste otro:

            If (Label1.Left = 0) OrElse (Label1.Top = 0) OrElse _
               (Label1.Location.X + Label1.Width >= Me.ClientSize.Width) OrElse _
               (Label1.Location.Y + Label1.Height >= Me.ClientSize.Height) Then

                MessageBox.Show("Bien")
                Label1.Location = New System.Drawing.Point(10, 10)

            End If


    Enrique Martínez [MS MVP - VB]
    sábado, 27 de junio de 2009 14:15
    Moderador
  • "alesly" escribió:

    > ehi mira tu emm softjaen! tu codigo funciona pero solo
    > para el lado derecho y en todods los demas bordes no
    > funciona

    El código que aparece más arriba, hace que se muestre un cuadro de mensaje cuando algún lado del control Label toca algún borde del formulario que lo contiene, bien sea el lado derecho o izquierdo, como el superior o inferior.

    Pero para que funcione correctamente, lo mismo tienes que ejecutar las líneas de código existentes en el evento KeyDown que estaba ejecutando el usuario emilios1995, que fue el que inició ésta conversación, y que encontrarás en el siguiente enlace:

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/fe874f5c-b295-4d6c-b694-83073bc1d6a2

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 14 de noviembre de 2011 17:21
    Moderador
  • "alesly" escribió:

    > ahora tengo un problema es que necesito que el shape mantenga el
    > movimiento constante osea que se mueva sin que yo este tecleando
    > ose a suponete que solo presione la teclade arriba y se sigua
    > moviendo asi arriba y con el que me das  solo se mueva si mantengo
    > las flechas presionadas me entendiste?

    Sí, te entiendo perfectamente. Lo que no entiendo es dónde tienes el problema para hacer que tu control se mueva únicamente presionando la tecla de dirección correspondiente.

    Hay que pensar un poquito, para hacer que el control se mueva en el evento Tick del control Timer en lugar de hacerlo en el evento KeyDown del formulario. ;-)

    Aquí tienes un ejemplo para mover un control Label por el formulario con las teclas de dirección. El control se estará moviendo en un sólo sentido (arriba, abajo, derecha, izquierda), hasta que cambies el sentido pulsando la correspondiente tecla de dirección. Asimismo, el control se dentendrá cuando alcance un borde del formulario.

    Public Class Form1
    
        Private m_key As Keys
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Inicializamos el control Label
            With Label1
                .BackColor = Color.Yellow
                .Location = New Point(100, 100)
            End With
    
            ' Configuramos el control Timer
            Dim tmr As New Timer()
            tmr.Interval = 1
            AddHandler tmr.Tick, AddressOf TimerOnTick
            tmr.Start()
    
        End Sub
    
        Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    
            Select Case e.KeyCode
                Case Keys.Left, Keys.Right, Keys.Up, Keys.Down
                    m_key = e.KeyCode
    
            End Select
    
        End Sub
    
        Private Sub TimerOnTick(sender As Object, e As EventArgs)
    
            Select Case m_key
                Case Keys.Right
                    If (Label1.Location.X + Label1.Width >= Me.ClientSize.Width) Then Return
    
                    Label1.Location = New Point(Me.Label1.Location.X + 2, Me.Label1.Location.Y)
    
                Case Keys.Left
                    If (Label1.Left = 0) Then Return
    
                    Label1.Location = New Point(Me.Label1.Location.X - 2, Me.Label1.Location.Y)
    
                Case Keys.Up
                    If (Label1.Top = 0) Then Return
    
                    Label1.Location = New Point(Me.Label1.Location.X, Me.Label1.Location.Y - 2)
    
                Case Keys.Down
                    If (Label1.Location.Y + Label1.Height >= Me.ClientSize.Height) Then Return
    
                    Label1.Location = New Point(Me.Label1.Location.X, Me.Label1.Location.Y + 2)
    
            End Select
    
        End Sub
    
    End Class
    

    Fíjate el poco código que hay que escribir. Adapta el ejemplo para hacer que se "mueva" tu control Shape en lugar de "mover" un control Label.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 14 de noviembre de 2011 19:26
    Moderador
  • "MauricioIvan" preguntó:

    > Una pregunta, como podría hacer lo mismo para moverlo con el mouse...
    > a mi me gustaría que arrancara antes de moverse, en una coordenada fija,
    > no se, con un click para que arranque el movimiento o no se que pero que
    > arranque por ejemplo desde x=100 y=100 (usando las mismas coordenadas
    > (posición/location) de tu ejemplo pero con el mouse.

    Hola, Mauricio Iván:

    A bote pronto, mira a ver si te sirve el siguiente ejemplo:

    Public Class Form1
    
        Private MoveControl As Boolean
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Inicializamos el control Label
            With Label1
                .BackColor = Color.Yellow
                .Location = New Point(100, 100)
            End With
    
        End Sub
    
        Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
    
            If (MoveControl) Then
                ' Cambiamos aleatoriamente el color de fondo del control.
                Dim r As New Random(DateTime.Now.Millisecond)
                Label1.BackColor = Color.FromArgb(r.Next(0, 255), r.Next(0, 255), r.Next(0, 255))
            End If
    
            ' Si el control no está moviéndose, hacemos que se mueva
            ' y si se está moviendo, lo detenemos.
            '
            MoveControl = Not MoveControl
    
        End Sub
    
        Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    
            If (MoveControl) Then
                ' Mientras que el control esté en movimiento
                ' establecemos su nueva posición.
                Label1.Location = e.Location
            End If
    
        End Sub
    

    Como podrás observar, el control Label (o cualquier otro) aparecerá en el punto (100, 100). Para comenzar el movimiento o detenerlo, haz clic sobre el propio control. Y mientras que el control esté en movimiento (el valor del campo MoveControl sea True), tan solo tienes que llevártelo con el ratón donde desees.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    martes, 5 de abril de 2016 14:43
    Moderador

Todas las respuestas

  • :-)
    Hola,

    Pues dependerà de como lo estés haciendo para arrastrar el picture. Pero si lo haces mediante DRAG & DROP, yo miraría el evento DragOver del Form, que se produce cuando arrastras algo sobre un objeto. En este evento, se te proporciona un parámetro con las coordenadas del cursor. Como ya sabes las dimensiones del formulario y las del picture, con un simple comparación ya lo tienes.

    Saludos,

    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    jueves, 25 de junio de 2009 8:57
    Moderador
  • Ayer te comenté lo que tenías que hacer en otro "hilo" que iniciastes con el asunto «AYUDA CON UN PEQUEÑO JUEGO (pregunta sencilla, soy principiante)», sin que aún hayas dicho algo al respeto:

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/fe874f5c-b295-4d6c-b694-83073bc1d6a2
    Enrique Martínez [MS MVP - VB]
    jueves, 25 de junio de 2009 13:12
    Moderador
  • SoftJaén: este es otro juego. en el pasado queria que pase algo cuando el label toca otro picturebox pero ahora quiero que pase cuando el label toca el limite del form, gracias por la respuesta de ayer pero hoy necesito otra
    jueves, 25 de junio de 2009 18:41
  • Sustituye el código que te indiqué para averiguar la intersección de los dos rectángulos, por éste otro:

            If (Label1.Left = 0) OrElse (Label1.Top = 0) OrElse _
               (Label1.Location.X + Label1.Width >= Me.ClientSize.Width) OrElse _
               (Label1.Location.Y + Label1.Height >= Me.ClientSize.Height) Then

                MessageBox.Show("Bien")
                Label1.Location = New System.Drawing.Point(10, 10)

            End If


    Enrique Martínez [MS MVP - VB]
    sábado, 27 de junio de 2009 14:15
    Moderador
  • ehi mira tu emm softjaen! tu codigo funciona pero solo para el lado derecho y en todods los demas bordes no funciona
    lunes, 14 de noviembre de 2011 16:10
  • "alesly" escribió:

    > ehi mira tu emm softjaen! tu codigo funciona pero solo
    > para el lado derecho y en todods los demas bordes no
    > funciona

    El código que aparece más arriba, hace que se muestre un cuadro de mensaje cuando algún lado del control Label toca algún borde del formulario que lo contiene, bien sea el lado derecho o izquierdo, como el superior o inferior.

    Pero para que funcione correctamente, lo mismo tienes que ejecutar las líneas de código existentes en el evento KeyDown que estaba ejecutando el usuario emilios1995, que fue el que inició ésta conversación, y que encontrarás en el siguiente enlace:

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/fe874f5c-b295-4d6c-b694-83073bc1d6a2

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 14 de noviembre de 2011 17:21
    Moderador
  • enrique gracias me funciono de maravilla ahora tengo un problema es que necesito que el shape mantenga el movimiento constante osea que se mueva sin que yo este tecleando ose a suponete que solo presione la teclade arriba y se sigua moviendo asi arriba y con el que me das  solo se mueva si mantengo las flechas presionadas me entendiste?

    gracias! si me podes ayudar con eso

    lunes, 14 de noviembre de 2011 17:44
  • enrique me puedes ayudar con otra  cosa esque tambien necesito que mi label aumente de velocidad cada 10 segundos te lo agradesco!
    lunes, 14 de noviembre de 2011 18:07
  • "alesly" escribió:

    > tambien necesito que mi label aumente de velocidad cada 10 segundos te lo agradesco!

    A ésta pregunta ya te he contestado en la siguiente conversación:

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/584b4868-14ef-48c2-b9e2-36b371e74de5

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 14 de noviembre de 2011 18:10
    Moderador
  • "alesly" escribió:

    > ahora tengo un problema es que necesito que el shape mantenga el
    > movimiento constante osea que se mueva sin que yo este tecleando
    > ose a suponete que solo presione la teclade arriba y se sigua
    > moviendo asi arriba y con el que me das  solo se mueva si mantengo
    > las flechas presionadas me entendiste?

    Sí, te entiendo perfectamente. Lo que no entiendo es dónde tienes el problema para hacer que tu control se mueva únicamente presionando la tecla de dirección correspondiente.

    Hay que pensar un poquito, para hacer que el control se mueva en el evento Tick del control Timer en lugar de hacerlo en el evento KeyDown del formulario. ;-)

    Aquí tienes un ejemplo para mover un control Label por el formulario con las teclas de dirección. El control se estará moviendo en un sólo sentido (arriba, abajo, derecha, izquierda), hasta que cambies el sentido pulsando la correspondiente tecla de dirección. Asimismo, el control se dentendrá cuando alcance un borde del formulario.

    Public Class Form1
    
        Private m_key As Keys
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Inicializamos el control Label
            With Label1
                .BackColor = Color.Yellow
                .Location = New Point(100, 100)
            End With
    
            ' Configuramos el control Timer
            Dim tmr As New Timer()
            tmr.Interval = 1
            AddHandler tmr.Tick, AddressOf TimerOnTick
            tmr.Start()
    
        End Sub
    
        Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    
            Select Case e.KeyCode
                Case Keys.Left, Keys.Right, Keys.Up, Keys.Down
                    m_key = e.KeyCode
    
            End Select
    
        End Sub
    
        Private Sub TimerOnTick(sender As Object, e As EventArgs)
    
            Select Case m_key
                Case Keys.Right
                    If (Label1.Location.X + Label1.Width >= Me.ClientSize.Width) Then Return
    
                    Label1.Location = New Point(Me.Label1.Location.X + 2, Me.Label1.Location.Y)
    
                Case Keys.Left
                    If (Label1.Left = 0) Then Return
    
                    Label1.Location = New Point(Me.Label1.Location.X - 2, Me.Label1.Location.Y)
    
                Case Keys.Up
                    If (Label1.Top = 0) Then Return
    
                    Label1.Location = New Point(Me.Label1.Location.X, Me.Label1.Location.Y - 2)
    
                Case Keys.Down
                    If (Label1.Location.Y + Label1.Height >= Me.ClientSize.Height) Then Return
    
                    Label1.Location = New Point(Me.Label1.Location.X, Me.Label1.Location.Y + 2)
    
            End Select
    
        End Sub
    
    End Class
    

    Fíjate el poco código que hay que escribir. Adapta el ejemplo para hacer que se "mueva" tu control Shape en lugar de "mover" un control Label.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 14 de noviembre de 2011 19:26
    Moderador
  • Buenos das Enrique. Estoy viendo el ejemplo para mover un label1 con las teclas flechas. Me parece genial. Una pregunta, como podría hacer lo mismo para moverlo con el mouse. Yo tengo un ejemplo muy bueno que baje del Canal pero arranca desde cualquier punto donde yo por casualidad ponga el mouse y a mi me gustaría que arrancara antes de moverse, en una coordenada fija, no se, con un click para que arranque el movimiento o no se que pero que arranque por ejemplo desde x=100 y=100 (usando las mismas coordenadas (posición/location) de tu ejemplo pero con el mouse.

    Gracias.

    MauricioIvan


    M3


    Para hacerlo mas exacto, así como comenzaría el movimiento con un click desde una location determinada, que se detuviera en cualquier location con otro click y cambie de color,  reinicie el movimiento con otro click.  Gracias
    • Editado MauricioIvan martes, 5 de abril de 2016 14:27 Ampliacion
    martes, 5 de abril de 2016 14:17
  • "MauricioIvan" preguntó:

    > Una pregunta, como podría hacer lo mismo para moverlo con el mouse...
    > a mi me gustaría que arrancara antes de moverse, en una coordenada fija,
    > no se, con un click para que arranque el movimiento o no se que pero que
    > arranque por ejemplo desde x=100 y=100 (usando las mismas coordenadas
    > (posición/location) de tu ejemplo pero con el mouse.

    Hola, Mauricio Iván:

    A bote pronto, mira a ver si te sirve el siguiente ejemplo:

    Public Class Form1
    
        Private MoveControl As Boolean
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Inicializamos el control Label
            With Label1
                .BackColor = Color.Yellow
                .Location = New Point(100, 100)
            End With
    
        End Sub
    
        Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
    
            If (MoveControl) Then
                ' Cambiamos aleatoriamente el color de fondo del control.
                Dim r As New Random(DateTime.Now.Millisecond)
                Label1.BackColor = Color.FromArgb(r.Next(0, 255), r.Next(0, 255), r.Next(0, 255))
            End If
    
            ' Si el control no está moviéndose, hacemos que se mueva
            ' y si se está moviendo, lo detenemos.
            '
            MoveControl = Not MoveControl
    
        End Sub
    
        Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    
            If (MoveControl) Then
                ' Mientras que el control esté en movimiento
                ' establecemos su nueva posición.
                Label1.Location = e.Location
            End If
    
        End Sub
    

    Como podrás observar, el control Label (o cualquier otro) aparecerá en el punto (100, 100). Para comenzar el movimiento o detenerlo, haz clic sobre el propio control. Y mientras que el control esté en movimiento (el valor del campo MoveControl sea True), tan solo tienes que llevártelo con el ratón donde desees.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    martes, 5 de abril de 2016 14:43
    Moderador
  • Gracias Enrique. Cuantos años ya hace que estas ahi al pie del cañon? yo tengo conversaciones desde no hace menos de cuatro años, lo vere luego en mis conversaciones, pero si hace un monton de años, y tu  dando desinterezadamente respuestas muy acertadas y sobre todo fructiferas.

    A Dios lo que es de Dios y al Cesar lo que es del Cesar, y tu eres de los pocos, que tienen el conocimiento y la disponibilidad de compartirlo.

    Yo le estube "rogandole" a un tal Genesis (yo soy Colombiano) que me ayudara con un codigo, lo persegui por todas partes y jamas me ayudó.  Y mira que figura y como "lumbrera delo canal" pero es una vela encerrada y todos sabemos que le pasa a una vela encerrada, se apaga por falta de oxigeno.

    Ya mismo voy a probar  codigo

    Muchas gracias Enrique


    M3

    martes, 5 de abril de 2016 15:11
  • !!! PERFECTO !!!!

    y camina como una exhalacion. (asi le decian a mi papa cuando este hijo suyo le robaba el carro, el se llamaba Nicolas, y le decian: Nico, por aqui pasó tu hijo como una exhalacion!

    Pues asi camina el button1. Al principio me confundí porque parece que el evento (o como se llame) no es el de arratre con el click presionado, este hace lo siguiente :El Label esta en la posicion 100,100

    Hago Click y LO SUELTO (no lo tengo presionado) y arrastro el Label1 y luego, en cualquier otra posicion (location) hago Click y para

    !!! FANTASTICO !!!

    Ya me tengo que ir a trabajar, pero si Dios quiere, ya pronto tendre mas tiempo para dedicarle al VB.

    Muchas Gracias, despues te cuento con mas detalles lo que estoy haciendo. recuerdas el ejercicio de sonidos? pues ya le demostre en la bodega que LA AUSENCIA DE SONIDO, es otro mensaje. Los mensajes del escaner del software que tenemos, vienen cada mensaje de tres formas diferentes, Texto, Color y Sonido, pero cuando todo esta bien, No hay sonido,hay texto y Color verde, pero se puede continuar al siguiente escaneo sin tener que revisar el color y el texto porque ya lo estoy revisando con el sonido ausente.

    Bueno. ahí te cuento. Ahora estoy haciendoles lo mismo pero animado.

    Gracias Enrrique

    Saludos

    MauricioIvan


    M3

    martes, 5 de abril de 2016 15:37
  • Viernes 10 de Agosto de 2007 a las 21:56 , fue mi primera conversacion en este Canal.

    Como pasa el tiempo, ya van a ser 9 años de estar en el Canal, espero seguir otro tanto.

    Saludos a todos

    MauricioIvan


    M3

    martes, 5 de abril de 2016 16:21