2012-01-08 16 views
6

Ho fatto un controllo personalizzato e quando viene soddisfatta una condizione, voglio mostrare un tooltip:Come evitare che il suggerimento di sfarfallio nel controllo personalizzato?

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    base.OnMouseMove(e); 

    var plannedItem = GetPlannedItemByPosition(e.Location); 

    if (plannedItem != null) 
     _tooltip.SetToolTip(this, plannedItem.Description); 
    else 
     _tooltip.RemoveAll(); 
} 

Questo codice funziona bene, eccettua per il viso che il tooltip sfarfalla.

Questo controllo personalizzato, dipinge tutte le informazioni nell'evento OnPaint, forse questo ha qualcosa a che fare con esso? E se lo fa, come posso evitare che il suggerimento di sfarfallio?

+0

In che modo esattamente "sfarfallio"? Vuoi dire che scompare e riappare quando muovi il mouse? Se è così, questo è il comportamento previsto. –

+0

Bene, quando sposto il mouse e appare il suggerimento, e tengo il mouse fermo, il suggerimento sfarfallio un po '. – Martijn

risposta

0

Immagino che il tuo mouse si muova un po 'quando pensi che sia immobile. Ti suggerisco di fare un po 'di memorizzazione nella cache qui - solo chiamare _tooltip.SetToolTip se l'oggetto pianificato è cambiato.

6

Ciò si verifica quando si visualizza il suggerimento sulla posizione del cursore del mouse. Non appena viene visualizzata la finestra dei suggerimenti, Windows rileva che il mouse si trova in quella finestra e pubblica un messaggio MouseMove. Il che fa sparire il suggerimento. Il che rende Windows inviare un messaggio MouseMove al tuo controllo, eseguendo il tuo metodo OnMouseMove(). Il che rende il tooltip nuovamente visibile. Etcetera, vedrai il tooltip che sfarfalla rapidamente.

risolvere questo uno dei seguenti metodi:

  • mostrano il suggerimento ben lontano dalla posizione del mouse in modo da non sovrapporsi il cursore del mouse
  • unico aggiornamento/visualizza tooltip quando è necessario essere cambiato
  • insieme di proprietà di cattura del controllo su true in modo che il suggerimento non sarà possibile ottenere un messaggio MouseMove
+0

Passent I Ho provato i suggerimenti 1 e 3 e il suggerimento è ancora sfarfallio. Per l'opzione uno ho questo codice: '_tooltip.Show (plannedItem.Description, this, e.X + 20, e.Y + 20);' – Martijn

+1

Codice postale che riproduce effettivamente il problema. –

+0

Nota: anche se si imposta il tooltip lontano dal mouse, è possibile che ciò accada perché il suggerimento è troppo vicino al bordo dello schermo e viene "spostato" a sinistra o in alto sopra il cursore del mouse. Fai attenzione ai lunghi suggerimenti visualizzati nella parte inferiore/destra dello schermo. –

1

Poiché si tratta di un controllo personalizzato dipinto, penso che potrebbe essere più facile da solo fai in modo che una variabile tenga l'ultimo suggerimento mostrato, e invece di "settare" sempre il suggerimento, mostralo.

semplice esempio (utilizzando solo un modulo):

public partial class Form1 : Form { 
    private List<TipRect> _Tips = new List<TipRect>(); 
    private TipRect _LastTip; 
    private ToolTip _tooltip = new ToolTip(); 

    public Form1() { 
    InitializeComponent(); 
    _Tips.Add(new TipRect(new Rectangle(32, 32, 32, 32), "Tip #1")); 
    _Tips.Add(new TipRect(new Rectangle(100, 100, 32, 32), "Tip #2")); 
    } 

    private void Form1_Paint(object sender, PaintEventArgs e) { 
    foreach (TipRect tr in _Tips) 
     e.Graphics.FillRectangle(Brushes.Red, tr.Rect); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) { 
    TipRect checkTip = GetTip(e.Location); 
    if (checkTip == null) { 
     _LastTip = null; 
     _tooltip.Hide(this); 
    } else { 
     if (checkTip != _LastTip) { 
     _LastTip = checkTip; 
     _tooltip.Show(checkTip.Text, this, e.Location.X + 10, e.Location.Y + 10, 1000); 
     } 
    } 
    } 

    private TipRect GetTip(Point p) { 
    TipRect value = null; 
    foreach (TipRect tr in _Tips) { 
     if (tr.Rect.Contains(p)) 
     value = tr; 
    } 
    return value; 
    } 
} 

Ecco la classe TipRect ho creato per simulare qualsiasi vostra classe PlannedItem è:

public class TipRect { 
    public Rectangle Rect; 
    public string Text; 

    public TipRect(Rectangle r, string text) { 
    Rect = r; 
    Text = text; 
    } 
} 
6

Ricorda ultima posizione del mouse e impostare il tooltip solo quando cambia la posizione del mouse.

public partial class Form1 : Form 
{ 
    private int lastX; 
    private int lastY; 

    private void button1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.X != this.lastX || e.Y != this.lastY) 
     { 
      toolTip1.SetToolTip(button1, "test"); 

      this.lastX = e.X; 
      this.lastY = e.Y; 
     } 

    } 
+2

Questo ha risolto il suggerimento lampeggiante per me. Grazie! – BoltBait

0

Per i visitatori di questa discussione, qui è quello che ho fatto, seguendo i suggerimenti di cui sopra (VB.NET):

Dim LastToolTip As String 
Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove 
    Dim NewToolTip = CalculateTooltipText(e.X, e.Y) 
    If LastToolTip <> NewToolTip Then 
     ToolTip1.SetToolTip(PictureBox1, NewToolTip) 
     LastToolTip = NewToolTip 
    End If 
End Sub 

si è fermato lo sfarfallio.

Problemi correlati