none
ToolTip sobre objeto Deshabilitado RRS feed

  • Pregunta

  • Buenas tardes a todos.... mi consulta en esta ocasión, es sobre como poner un ToolTip sobre un objeto que lo tengo deshabilitado... es un botón que se deshabilita porque no hay conexión a Internet... pero yo quiero enviarle un mensaje al usuario indicando el porque esta deshabilitado el botón... lo quiero hacer cuando el usuario pase el mouse sobre el objeto (Mouseover)... pero este no esta disponible si el objeto no esta habilitado...

    Alguna sugerencia ???

    Gracias por su ayuda...

    martes, 28 de mayo de 2013 23:49

Respuestas

  • Estoy de acuerdo con lo de que la solución (si es que se le puede llamar solución) es burda, porque, de hecho, no es la solución a lo que planteas. 

    Estuve revisando y sí existe una forma de hacerlo. Suponiendo que tu botón se llama "Button1" y el control de tips "ToolTip1", el código te queda así:

        Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
            'Requerido
            MyBase.OnMouseMove(e)
    
            'Si el cursor está sobre el botón
            If Me.GetChildAtPoint(e.Location) Is Button1 Then
                'Si el tip no está visible, lo muestro
                If String.IsNullOrEmpty(ToolTip1.GetToolTip(Me)) Then
                    ToolTip1.SetToolTip(Me, ToolTip1.GetToolTip(Button1))
                    ToolTip1.Show(ToolTip1.GetToolTip(Me), Me, e.Location, 5000)
                End If
            ElseIf Not String.IsNullOrEmpty(ToolTip1.GetToolTip(Me)) Then 'Si el tip está visible
                'Oculto tip
                ToolTip1.SetToolTip(Me, String.Empty)
                ToolTip1.Hide(Me)
            End If
        End Sub

    Lo que hago aquí es usar la función compartida GetChildAtPoint de la clase Control, que me devuelve el control ubicado en las coordenadas indicadas en el primer parámetro. Como ves, esto lo hago dentro del evento MouseMove del formulario; de ese modo, puedo verificar si el cursor está sobre el botón inactivo, y en caso afirmativo, muestro el tip. Al mismo tiempo, cuando el cursor sale de sobre el botón, oculto el tip.

    Cabe mencionar que probé hacer esto en el evento MouseHover del formulario, pero por alguna razón, no funcionó. A veces mostraba el tip, y otras veces no. Por eso decidí dejarlo en MouseMove.

    Por favor, prueba el código y dinos que tal te va. Es mi más sincero deseo que puedas deshacerte lo más pronto posible de ese falso botón desactivado, y trabajar como debe ser. :D

    Un saludo.


    Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí
    Confucio

    • Marcado como respuesta wichortiz miércoles, 5 de junio de 2013 18:38
    martes, 4 de junio de 2013 4:16
  • Disculpa la demora. No tengo internet en casa.

    Pues ciertamente me faltó ese detalle. Para corregirlo, valida que el botón esté inactivo también. Modifícalo así:

    'Si el botón está inactivo y el cursor está sobre él
    If Not Button1.Enabled _
    AndAlso Me.GetChildAtPoint(e.Location) Is Button1 Then
        ...
    ElseIf ...
        ...
    End If

    Así validas que el botón esté inactivo para mostrar el tip. En caso contrario, no se muestra.

    Omití el resto del código para que te quedara claro cuál es la modificación. De resto todo queda igual.

    Saludos.


    Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí
    Confucio

    • Editado Jeison Friedman viernes, 7 de junio de 2013 18:11
    • Marcado como respuesta wichortiz sábado, 8 de junio de 2013 16:26
    viernes, 7 de junio de 2013 18:11

Todas las respuestas

  • hola

    el tema es que el concepto de enabled=false tambien anula todos los eventos del control

    quizas deberias buscar algun otro estado como ser readonly

    o sea desde codigo le quitas el evento, lo desatachas

    y luego le cambias el color al boton para indicar que esta anulado, le puede cambiar el color de la fuente tambien

    pero no usas la propeidad enabled para nada, asi simularias un deshabilitado de forma manual sin anular por completo los eventos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Propuesto como respuesta Sergio Parra miércoles, 29 de mayo de 2013 6:46
    miércoles, 29 de mayo de 2013 2:24
  • Muchas gracias Leandro por tu amable respuesta..... lastimosamente no he podido aplicarla, ya que la propiedad "readonly" no existe para el boton, por lo tanto no tengo idea de como "desatacharlo"... y es que la verdad no estoy muy diestro en la programacion a ese nivel. Si me pudieras dar una idea de como proceder te estaria agradecido...

    Esperando tu respuesta.

    domingo, 2 de junio de 2013 19:12
  • Bueno... les escribo para contarles una solucion temporal que encontre para el problema planteado ya que en ninguna parte he podido encontrar una solucion favorable....

    Lo que hice, sencillamente fue crear dos botones, uno para "habilitado" y el otro para "Deshabilitado", cambiando el color de fondo para este ultimo.... al abrir el formulario, verifico la conexion a internet y dependiendo de lo que resulte, hago visible uno que otro boton.... un poco burda la solucion pero al fin y al cabo, para el usuario es indiferente como se soluciona, si no como se lo presentas.... (El boton deshabilitado no tiene codigo, por lo que aunque se presione, no va a hacer nada)...

    Gracias Leandro por tu tiempo y si se te ocurre otra solucion con gusto la estare aplicando...

    • Marcado como respuesta wichortiz domingo, 2 de junio de 2013 22:34
    • Desmarcado como respuesta wichortiz miércoles, 5 de junio de 2013 18:38
    domingo, 2 de junio de 2013 22:34
  • Estoy de acuerdo con lo de que la solución (si es que se le puede llamar solución) es burda, porque, de hecho, no es la solución a lo que planteas. 

    Estuve revisando y sí existe una forma de hacerlo. Suponiendo que tu botón se llama "Button1" y el control de tips "ToolTip1", el código te queda así:

        Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
            'Requerido
            MyBase.OnMouseMove(e)
    
            'Si el cursor está sobre el botón
            If Me.GetChildAtPoint(e.Location) Is Button1 Then
                'Si el tip no está visible, lo muestro
                If String.IsNullOrEmpty(ToolTip1.GetToolTip(Me)) Then
                    ToolTip1.SetToolTip(Me, ToolTip1.GetToolTip(Button1))
                    ToolTip1.Show(ToolTip1.GetToolTip(Me), Me, e.Location, 5000)
                End If
            ElseIf Not String.IsNullOrEmpty(ToolTip1.GetToolTip(Me)) Then 'Si el tip está visible
                'Oculto tip
                ToolTip1.SetToolTip(Me, String.Empty)
                ToolTip1.Hide(Me)
            End If
        End Sub

    Lo que hago aquí es usar la función compartida GetChildAtPoint de la clase Control, que me devuelve el control ubicado en las coordenadas indicadas en el primer parámetro. Como ves, esto lo hago dentro del evento MouseMove del formulario; de ese modo, puedo verificar si el cursor está sobre el botón inactivo, y en caso afirmativo, muestro el tip. Al mismo tiempo, cuando el cursor sale de sobre el botón, oculto el tip.

    Cabe mencionar que probé hacer esto en el evento MouseHover del formulario, pero por alguna razón, no funcionó. A veces mostraba el tip, y otras veces no. Por eso decidí dejarlo en MouseMove.

    Por favor, prueba el código y dinos que tal te va. Es mi más sincero deseo que puedas deshacerte lo más pronto posible de ese falso botón desactivado, y trabajar como debe ser. :D

    Un saludo.


    Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí
    Confucio

    • Marcado como respuesta wichortiz miércoles, 5 de junio de 2013 18:38
    martes, 4 de junio de 2013 4:16
  • Gracias ENORMES Jason !!!!!.... una solucion bastante creativa en realidad y muy efectiva, te agradezco mucho tu respuesta que ha sido la verdadera solucion a mi inconveniente.... me trabaja perfectamente con un pequeño cambio....  la parte: 

    MyBase.OnMouseMove(e)

    La cambie por: 

    Handles MyBase.MouseMove

    Ya que me daba unos erroes de desbordamiento y no me recuerdo exactamente los otros....  pero con ese cambio trabaja como queria (por supuesto, le cambie el nombre al boton).... 

    Solo me queda una "pequeña" duda... y es que cuando el boton esta habilitado (hay conexion a Internet), la primera vez que paso el Mouse sobre el boton, me presenta el mensaje del Tooltip, luego ya no..... a que se debera ???....

    De nuevo muchas gracias y me complace que gente tan capaz como tu y Leandro se molesten en ayudarnos a nosotros los mortales, jajajajajajaja

    Saludos.

    miércoles, 5 de junio de 2013 18:37
  • Disculpa la demora. No tengo internet en casa.

    Pues ciertamente me faltó ese detalle. Para corregirlo, valida que el botón esté inactivo también. Modifícalo así:

    'Si el botón está inactivo y el cursor está sobre él
    If Not Button1.Enabled _
    AndAlso Me.GetChildAtPoint(e.Location) Is Button1 Then
        ...
    ElseIf ...
        ...
    End If

    Así validas que el botón esté inactivo para mostrar el tip. En caso contrario, no se muestra.

    Omití el resto del código para que te quedara claro cuál es la modificación. De resto todo queda igual.

    Saludos.


    Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí
    Confucio

    • Editado Jeison Friedman viernes, 7 de junio de 2013 18:11
    • Marcado como respuesta wichortiz sábado, 8 de junio de 2013 16:26
    viernes, 7 de junio de 2013 18:11
  • Muy amable de tu parte Jason.... quedo de maravilla !!!!.... gracias por tu valiosa ayuda y creo que doy por cerrado este punto...

    Un abrazo,

    sábado, 8 de junio de 2013 16:23