禁用按钮上的工具提示

问题描述:

我之前发布了这个问题,有人将其标记为DUPLICATE。但是当我问他关于那个应该有答案的帖子时,他没有任何适当的解释。所以请在标记或投票前仔细阅读这个问题。禁用按钮上的工具提示

我的问题是关于在DISABLED按钮上显示工具提示。

this.btnMy.Enabled = false; 

我有一个按钮,它放置在一个面板里面,并带有与其相关的工具提示。现在,当按钮被启用时,它都可以正常工作。

但是,如果按钮是已禁用,则工具提示不起作用。这似乎是标准的行为。

现在我想要显示的按钮时,工具提示已禁用太。所以我做了以下事情。

private ToolTip m_tooltip = new ToolTip(); 
private bool toolTipShown = false; 
private button btnMy; 

m_tooltip.InitialDelay = 0; 
m_tooltip.ShowAlways = true; 

private void myForm_MouseMove(object sender, MouseEventArgs e) 
     { 

      if (this.btnMy == FindControlAtCursor(this)) 
      { 
       if (!toolTipShown) 
       { 
        m_tooltip.Show("MyToolTip", this.btnMy, e.Location); 
        toolTipShown = true; 
       } 
      } 
      else 
      { 
       m_tooltip.Hide(this.btnGiven); 
       toolTipShown = false; 
      } 
     } 

由于按钮是面板的内部,我不得不使用其他几个功能找到确切按钮控制当鼠标在它。

public static Control FindControlAtPoint(Control container, Point pos) 
     { 
      Control child; 
      foreach (Control c in container.Controls) 
      { 
       if (c.Visible && c.Bounds.Contains(pos)) 
       { 
        child = FindControlAtPoint(c, new Point(pos.X - c.Left, pos.Y - c.Top)); 
        if (child == null) return c; 
        else return child; 
       } 
      } 
      return null; 
     } 

     public static Control FindControlAtCursor(Form form) 
     { 
      Point pos = Cursor.Position; 
      if (form.Bounds.Contains(pos)) 
       return FindControlAtPoint(form, form.PointToClient(Cursor.Position)); 
      return null; 
     } 

现在,当我调试,我可以看到代码找到正确的按钮,并尝试调用ToolTip.Show,但由于某种原因,它没有得到显示。

在调试时,我看到一个小的工具提示弹出。在发布模式下其他方面,没有任何显示。

任何想法?

+0

右侧顶部_Related_问题是[此](http://*.com/questions/491267/how-can-i-show-a-tooltip-on-a-disabled-按钮?RQ = 1)。这个问题的答案不适用吗? – HABO

我不会去争论它是否是重复的(虽然HABO在评论中指出它看起来非常类似于How can I show a tooltip on a disabled button?)。另外我不打算讨论整个代码。

的主要问题是在这条线

m_tooltip.Show("MyToolTip", this.btnMy, e.Location); 

documentationToolTip.Show过载所使用状态的point参数

甲点包含的偏移量,以像素为单位,相对于在相关控制窗口的左上角显示工具提示。

当你传递一个点相对于窗体。

为了解决这个问题,你应该使用这样的事情

var pos = this.btnMy.PointToClient(this.PointToScreen(e.Location)); 
m_tooltip.Show("MyToolTip", this.btnMy, pos); 
+0

我不确定发生了什么事。正如我在问题中所解释的,当我通过代码进行调试时,我可以看到弹出的工具提示。但是,在调试器外运行应用程序时,它不会显示出来。这不奇怪吗? – don

+0

@don我试过了,它可以在VS和EXE(发布模式)下工作。但是,如果我将按钮放在面板中,它既不适用于这两方面,因为该表格显然不会收到MouseMove,而是Panel。你确定你遇到的问题的原因并不是那么微不足道,即需要连接到面板'MouseMove'事件? –

+0

应该将MouseMove事件挂接到面板?这会工作吗? – don

MouseMove事件将不触发当鼠标移动到子控件或面板,所以你好得多使用定时器来代替:

private void timer1_Tick(object sender, EventArgs e) { 
    Control c = FindControlAtPoint(this, this.PointToClient(Control.MousePosition)); 
    if (c != null) { 
    Point p = c.PointToClient(Control.MousePosition); 
    p.Offset(10, 10); 
    m_tooltip.Show("Found " + c.Name, c, p); 
    m_tooltip.Active = true; 
    } else { 
    m_tooltip.Active = false; 
    } 
}