Announcement

Collapse
No announcement yet.

Tooltipp verschwindet zu schnell

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tooltipp verschwindet zu schnell

    Hallo Experten,

    scheinbar löst ein Tooltipp nicht aus, wenn sein Steuerelement deaktiviert ist. Deswegen habe ich das MouseHover-Ereignis des Elterncontainers benutzt und teste die Koordinaten des Steuerelements selbst:[highlight=c#]private void Form1_MouseHover(object sender, EventArgs e)
    {
    Point ptCursor = this.PointToClient(Cursor.Position);
    if (btBack.Location.X <= ptCursor.X
    && ptCursor.X <= btBack.Location.X + btBack.Width
    && btBack.Location.Y <= ptCursor.Y
    && ptCursor.Y <= btBack.Location.Y + btBack.Height)
    {
    if (btBack.Enabled == false) ttHelp.Show("Es existiert kein voriger Schritt", btBack, 2000);
    else ttHelp.Show("Führt zurück zum vorigen Schritt", btBack, 2000);
    }
    else if (btForth.Location.X <= ptCursor.X
    && ptCursor.X <= btForth.Location.X + btForth.Width
    && btForth.Location.Y <= ptCursor.Y
    && ptCursor.Y <= btForth.Location.Y + btForth.Height)
    {
    if (btForth.Enabled == false) ttHelp.Show("Es existiert kein nächster Schritt", btForth, 2000);
    else ttHelp.Show("Führt zum nächsten Schritt", btForth, 2000);
    }
    }[/highlight]Der Tooltipp erscheint auch. Er bleibt aber nicht die gewünschten 2000 ms stehen, sondern verschwindet sofort wieder.

    Wie geht man richtig mit so einem Tooltipp um?

    Mit freundlichem Gruß,


    luker

  • #2
    Hallo,

    wenn ein Steuerelement deaktiviert ist (Enabled = false) dann werden für dieses keine Maus- und Tastaturereignisse verarbeitet. Somit kann das ToolTip nicht prüfen ob es sich über einem Steuerelement befindet und angezeigt werden soll.

    Deshalb muss - wie du auch gemacht hast - dies selbst implementiert werden.
    Es gibt jedoch eine "elegantere" Lösung als deine. Schau dir mal mein Beispiel an. Die Anzeigedauer ist nicht explizit gesetzt, sondern wird aus den Einstellungen (hier im Designer erledigt) verwendet.

    Anmerkung: Ist das Steuerelement (im Bsp textBox1) aktiv verarbeitet es die Maus- und Tastaturereignisse selbst und werden nicht an die Form - den übergeordneten Container im Allgemeinen - geleitet. Dh der Code in Form1_MouseMove wird nur verarbeitet wenn textBox1.Enabled = false, sofern sich die Maus über textBox1 befindet.

    [highlight=c#]
    using System;
    using System.Windows.Forms;

    namespace WindowsFormsApplication1
    {
    public partial class Form1 : Form
    {
    private bool _isToolTipShows = false;
    //---------------------------------------------------------------------
    public Form1()
    {
    InitializeComponent();
    }
    //---------------------------------------------------------------------
    private void button1_Click(object sender, EventArgs e)
    {
    textBox1.Enabled = !textBox1.Enabled;
    }
    //---------------------------------------------------------------------
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
    Control ctrl = this.GetChildAtPoint(e.Location);

    if (ctrl != null)
    {
    // TextBox1:
    if (ctrl == textBox1 && !_isToolTipShows)
    {
    toolTip1.Show(
    toolTip1.GetToolTip(textBox1),
    textBox1,
    e.Location);

    _isToolTipShows = true;
    }
    }
    else
    {
    toolTip1.Hide(textBox1);
    _isToolTipShows = false;
    }
    }
    }
    }
    [/highlight]

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Gelöst

      Hallo gfoidl,

      in Anlehnung an Deinen Vorschlag aber mit zwei Eventhandlern habe ichs jetzt so gebaut:[highlight=c#]
      /// <summary>
      /// Show ToolTips on disabled controls
      /// </summary>
      private void Form1_MouseHover(object sender, EventArgs e)
      {
      Point ptCursor = this.PointToClient(Cursor.Position);
      Control ctrlOver = this.GetChildAtPoint(ptCursor);

      if (ctrlOver != null && !m_bToolTipShows)
      {
      ttHelp.Show(ttHelp.GetToolTip(ctrlOver), ctrlOver, ptCursor);
      m_bToolTipShows = true;
      }
      }


      /// <summary>
      /// Hide ToolTips for disabled controls
      /// </summary>
      private void Form1_MouseMove(object sender, MouseEventArgs e)
      {
      Point ptCursor = this.PointToClient(Cursor.Position);
      Control ctrlOver = this.GetChildAtPoint(ptCursor);

      if (ctrlOver == null)
      {
      ttHelp.Hide(this);
      m_bToolTipShows = false;
      }
      }[/highlight]Mit vorweihnachtlichem Dank,


      luker

      Comment


      • #4
        Doch nicht gelöst

        Hallo Experten,

        ich muss den Thread doch nochmal hervorkramen.
        Zwar funktioniert der ToolTip meistens, aber er wird noch nicht korrekt wieder ausgeblendet.

        Wenn der Mauszeiger zu schnell vom deaktivierten Control auf irgendein anderes bewegt wird, dann bleibt der ToolTip stehen.
        In diesem Zustand wird auch kein ToolTip auf irgendeinem anderen Control angezeigt. Man kann die normale Funktion erst wieder herstellen, indem der Mauszeiger über eine Fläche auf Form1 gerät, die von keinem Control belegt ist.
        Mit anderen Worten [highlight="C#"] /// <summary>
        /// Hide ToolTips for disabled controls
        /// </summary>
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
        Point ptCursor = this.PointToClient(Cursor.Position);
        Control ctrlOver = this.GetChildAtPoint(ptCursor);

        if (ctrlOver == null)
        {
        // Dieser Block wird nicht ausgeführt
        ttHelp.Hide(this);
        m_bToolTipShows = false;
        }
        } [/highlight]

        Was kann man da tun?

        Comment

        Working...
        X