2012-01-08 53 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 

它停止閃爍。