2012-01-08 94 views
6

我做了一个自定义的控制,当条件满足,我要显示工具提示:如何防止工具提示在自定义控件中闪烁?

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

此代码工作正常,节选为工具提示闪烁的脸。

此自定义控件绘制OnPaint事件中的所有信息,也许这与它有关?如果确实如此,我该如何防止工具提示闪烁?

+0

它究竟如何“闪烁”?你的意思是说,当你移动鼠标时它会消失并重新出现?如果是这样,那是预期的行为。 – 2012-01-08 12:05:43

+0

好吧,当我移动鼠标并出现工具提示时,我仍然保持鼠标静止,工具提示闪烁一下。 – Martijn 2012-01-08 12:08:10

回答

0

我想你的鼠标确实会移动一点,当你认为它仍然是。我建议你在这里做一些缓存 - 如果plansItem已经改变,只调用_tooltip.SetToolTip。

6

当您在鼠标光标位置显示工具提示时,会发生这种情况。一旦提示窗口出现,Windows就会注意到鼠标位于该窗口中并发布了一条MouseMove消息。这使得工具提示消失。这使得Windows向你的控件发送一个MouseMove消息,运行你的OnMouseMove()方法。这使得工具提示再次出现。 Etcetera,你会看到工具提示快速闪烁。

通过任何以下方法解决此问题:

  • 显示工具提示从鼠标位置以及远,所以它不会重叠鼠标光标
  • 仅更新/显示工具提示时,它需要改变
  • 控制的捕获属性设置为true,以便提示不会得到的MouseMove消息
+0

Passent我试过了建议1和3,工具提示仍然闪烁。对于选项一,我有这样的代码:'_tooltip.Show(plannedItem.Description,this,e.X + 20,e.Y + 20);' – Martijn 2012-01-08 17:04:19

+1

邮政编码,实际上重现了问题。 – 2012-01-08 19:06:42

+0

请注意,即使您将工具提示设置为远离鼠标,您也可能会发生这种情况,因为工具提示太接近屏幕边缘,并且再次向左或向上“推”左或向上。 注意屏幕底部/右侧附近显示的长工具提示。 – 2017-11-14 17:10:55

1

因为这是一个画自定义控件,我想可能是容易只是有一个变量保存最后显示的提示,而不是始终“设置”工具提示,只显示它。

简单的例子(使用只是一种形式):

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

这里是我创建模拟无论你PlannedItem类是TipRect类:

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

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

记住上次鼠标的位置,并设置提示只有当鼠标位置改变时。

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

这固定了我闪烁的工具提示。谢谢! – BoltBait 2016-11-21 08:22:59

0

该线程的游客,这里是我做的,按照上述(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 

它停止闪烁。