none
¿Se puede evitar que un control dispare eventos del ratón? (explico) RRS feed

  • Pregunta

  • Si en un control de usuario inserto un control de etiqueta por ejemplo y pongo su propiedad Dock = Fill para que abarque todo el control y luego hago click sobre el control, como la etiqueta lo abarca todo, recibe el click y dispara su evento, el click del control nunca se dispara.

    ¿Hay forma de evitar que la etiqueta reciba el click y lo reciba el control (no solo el evento MouseClick sino todos los eventos MouseMove, MouseDown, Enter, Leave, etc.)?

    P. D. Si pongo la propiedad Enabled = False de la etiqueta, allí sí el control dispara los eventos del ratón, el problema es que visualiza el texto de la etiqueta como desactivado. Deseo exactamente el mismo comportamiento pero sin que la apariencia del control luzca como desactivado.



    • Editado James2016-2 sábado, 24 de octubre de 2020 19:46
    sábado, 24 de octubre de 2020 19:46

Respuestas

  • Entiendo que es un Windows Form, ¿verdad? Porque si fuese un proyecto de WPF el evento sí que "burbujea" hasta el contenedor.

    Se me ocurre una sugerencia, que es prescindir de la etiqueta y en su lugar dibujar directamente sobre el fondo del control el mismo texto que planeabas presentar mediante la etiqueta. De esta manera, todos los eventos le llegarán al control.

    Para ello, implementa un manejador para el evento Paint del control, o bien haz un Overrides del método OnPaint del control. Y dentro de ese evento o método, llama a e.Graphics.Drawstring(....) pasándole los parámetros para decirle qué texto y dónde quieres pintarlo.

    • Marcado como respuesta James2016-2 sábado, 24 de octubre de 2020 21:20
    sábado, 24 de octubre de 2020 21:14
  • a si es esa forma solo funciona si el color es negro y no muy bien ya que no es un color intenso puedes hacerlo como el compañero Alberto dice o tambien llamando los eventos del formulario atraves de los eventos del label

    Public Class Form1
    
        Private Sub Label1_MouseClick(sender As Object, e As MouseEventArgs) Handles Label1.MouseClick
            If e.Button = MouseButtons.Left Then
                Me.OnClick(e)
            End If
        End Sub
    
        Private Sub Form1_Click(sender As Object, e As EventArgs) Handles Me.Click
            MsgBox("Hola mundo")
        End Sub
    
    End Class


    • Editado DANTE-3D sábado, 24 de octubre de 2020 23:38
    • Marcado como respuesta James2016-2 sábado, 24 de octubre de 2020 23:42
    sábado, 24 de octubre de 2020 23:37

Todas las respuestas

  • Entiendo que es un Windows Form, ¿verdad? Porque si fuese un proyecto de WPF el evento sí que "burbujea" hasta el contenedor.

    Se me ocurre una sugerencia, que es prescindir de la etiqueta y en su lugar dibujar directamente sobre el fondo del control el mismo texto que planeabas presentar mediante la etiqueta. De esta manera, todos los eventos le llegarán al control.

    Para ello, implementa un manejador para el evento Paint del control, o bien haz un Overrides del método OnPaint del control. Y dentro de ese evento o método, llama a e.Graphics.Drawstring(....) pasándole los parámetros para decirle qué texto y dónde quieres pintarlo.

    • Marcado como respuesta James2016-2 sábado, 24 de octubre de 2020 21:20
    sábado, 24 de octubre de 2020 21:14
  • Entiendo que es un Windows Form, ¿verdad? Porque si fuese un proyecto de WPF el evento sí que "burbujea" hasta el contenedor.

    Se me ocurre una sugerencia, que es prescindir de la etiqueta y en su lugar dibujar directamente sobre el fondo del control el mismo texto que planeabas presentar mediante la etiqueta. De esta manera, todos los eventos le llegarán al control.

    Para ello, implementa un manejador para el evento Paint del control, o bien haz un Overrides del método OnPaint del control. Y dentro de ese evento o método, llama a e.Graphics.Drawstring(....) pasándole los parámetros para decirle qué texto y dónde quieres pintarlo.

    Gracias, sí es para un Windows Form. En realidad para un control de usuario que a la vez lo añadiré a un Windows Form. 
    sábado, 24 de octubre de 2020 21:30
  • Prueva a poner la propiedad UseCompatibleTextRendering en true y el estilo de fuente en Bold tambien puedes darle un poco mas de tamaño al texto con eso el texto toma color
    sábado, 24 de octubre de 2020 21:36
  • Prueva a poner la propiedad UseCompatibleTextRendering en true y el estilo de fuente en Bold tambien puedes darle un poco mas de tamaño al texto con eso el texto toma color

    Hola, pero si le pongo rojo por ejemplo, no es que se vea así rojo, solo lo oscurece un poco, como un paleativo ¿cierto? 

    Me gustaría que se vean los colores, de todos modos gracias por la sugerencia.


    sábado, 24 de octubre de 2020 23:10
  • a si es esa forma solo funciona si el color es negro y no muy bien ya que no es un color intenso puedes hacerlo como el compañero Alberto dice o tambien llamando los eventos del formulario atraves de los eventos del label

    Public Class Form1
    
        Private Sub Label1_MouseClick(sender As Object, e As MouseEventArgs) Handles Label1.MouseClick
            If e.Button = MouseButtons.Left Then
                Me.OnClick(e)
            End If
        End Sub
    
        Private Sub Form1_Click(sender As Object, e As EventArgs) Handles Me.Click
            MsgBox("Hola mundo")
        End Sub
    
    End Class


    • Editado DANTE-3D sábado, 24 de octubre de 2020 23:38
    • Marcado como respuesta James2016-2 sábado, 24 de octubre de 2020 23:42
    sábado, 24 de octubre de 2020 23:37
  • a si es esa forma solo funciona si el color es negro y no muy bien ya que no es un color intenso puedes hacerlo como el compañero Alberto dice o tambien llamando los eventos del formulario atraves de los eventos del label

    Public Class Form1
    
        Private Sub Label1_MouseClick(sender As Object, e As MouseEventArgs) Handles Label1.MouseClick
            If e.Button = MouseButtons.Left Then
                Me.OnClick(e)
            End If
        End Sub
    
        Private Sub Form1_Click(sender As Object, e As EventArgs) Handles Me.Click
            MsgBox("Hola mundo")
        End Sub
    
    End Class


    Ah, esa es otra alternativa. Gracias.
    sábado, 24 de octubre de 2020 23:42
  • para mi es un placer ayudarle
    sábado, 24 de octubre de 2020 23:46
  • Gracias por levantar tu consulta en los foros de MSDN. Cerraremos el Hilo, por ende si tiene alguna otra consulta por favor genera otra consulta para que la comunidad de foros te pueda asesorar.

     

    Siempre es un placer atender tus consultas!

    --------------------------------------------------------------------------------

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    lunes, 26 de octubre de 2020 19:48
    Moderador