2015-12-22 160 views
-1

我之前發佈了這個問題,有人將其標記爲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://stackoverflow.com/questions/491267/how-can-i-show-a-tooltip-on-a-disabled-按鈕?RQ = 1)。這個問題的答案不適用嗎? – HABO

回答

1

我不會去爭論它是否是重複的(雖然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

0

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