2012-01-08 14 views
6

me han hecho un control personalizado y cuando se cumpla una condición, quiero mostrar un texto de ayuda:Cómo evitar que la información sobre herramientas parpadee en el control personalizado?

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(); 
} 

Este código funciona bien, exceptúa de la cara que la información sobre herramientas parpadea.

Este control personalizado, describe toda la información en el evento OnPaint, ¿quizás esto tiene algo que ver con eso? Y si lo hace, ¿cómo puedo evitar que la información sobre herramientas parpadee?

+0

¿Cómo exactamente "parpadea"? ¿Quiere decir que desaparece y reaparece cuando mueve el mouse? Si es así, ese es el comportamiento esperado. –

+0

Bueno, cuando muevo el mouse y aparece la información sobre herramientas, y mantengo el mouse quieto, la información sobre herramientas parpadea un poco. – Martijn

Respuesta

0

Imagino que su mouse se mueve un poco cuando cree que está quieto. Le sugiero que haga algún tipo de almacenamiento en caché aquí; solo llame a _tooltip.SetToolTip si el elemento plannedItem ha cambiado.

6

Esto sucederá cuando visualice la información sobre herramientas en la posición del cursor del mouse. Tan pronto como aparece la ventana de sugerencia, Windows nota que el mouse está ubicado en esa ventana y publica un mensaje MouseMove. Lo que hace que la información sobre herramientas desaparezca. Lo que hace que Windows envíe un mensaje de MouseMove a su control, ejecutando su método OnMouseMove(). Lo que hace que la información sobre herramientas aparezca de nuevo. Etcétera, verá que la información sobre herramientas parpadea rápidamente.

resolver esto mediante cualquiera de los métodos siguientes:

  • muestran la información sobre herramientas bien lejos de la posición del ratón por lo que no se solapará el cursor del ratón
  • única actualización/mostrar la información sobre herramientas cuando se necesita ser cambiado
  • conjunto de propiedades de captura del control en cierto modo la información sobre herramientas no recibirá un mensaje MouseMove
+0

Passent I He intentado la sugerencia 1 y tres y la información sobre herramientas aún parpadea. Para la opción uno, tengo este código: '_tooltip.Show (plannedItem.Description, this, e.X + 20, e.Y + 20);' – Martijn

+1

Código postal que realmente reproduce el problema. –

+0

Nota, incluso si configura la información sobre herramientas lejos del mouse, puede suceder porque la información sobre herramientas está demasiado cerca del borde de la pantalla y se "empuja" hacia la izquierda o hacia arriba sobre el cursor del mouse nuevamente. Tenga cuidado con la información sobre herramientas larga que se muestra cerca de la parte inferior/derecha de la pantalla. –

1

Dado que este es un control personalizado pintado, yo creo que puede ser más fácil simplemente tener una variable que contenga el último consejo que se muestra, y en lugar de siempre "configurar" la información sobre herramientas, simplemente muéstrela.

ejemplo simple (utilizando sólo una forma):

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; 
    } 
} 

Aquí está la clase TipRect he creado para simular cualquiera que sea su clase PlannedItem es:

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

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

Recuerde última posición del ratón y establece la información sobre herramientas solo cuando la posición del mouse cambia.

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

Esto corrigió la información sobre herramientas parpadeante para mí. ¡Gracias! – BoltBait

0

Para los visitantes de este hilo, aquí es lo que hice, siguiendo las sugerencias anteriores (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 

se detuvo el parpadeo.

Cuestiones relacionadas