2013-10-09 64 views
1

我試圖表現出禁止控制..我能做到這一點的形式,鼠標移動事件的提示,即使它是工作的罰款已禁用控件Tooltip無法在Windows窗體中使用組框?

http://stackoverflow.com/questions/491267/how-can-i-show-a-tooltip-on-a-disabled-button 

,但是當我這樣做是爲了控制一組箱子裏面是不工作..

需要幫助,當我把控制outsid

代碼我使用..

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    var parent = sender as Control; 
    if (parent == null) 
    { 
     return; 
    } 
    var ctrl = parent.GetChildAtPoint(e.Location); 
    if (ctrl != null && !ctrl.Enabled) 
    { 
     if (ctrl.Visible && toolTip1.Tag == null) 
     { 
      var tipstring = "My tooltip";// toolTip1.GetToolTip(ctrl); 
      toolTip1.Show(tipstring, ctrl, ctrl.Width/2, ctrl.Height/2); 
      toolTip1.Tag = ctrl; 
     } 
    } 
    else 
    { 
     ctrl = toolTip1.Tag as Control; 
     if (ctrl != null) 
     { 
      toolTip1.Hide(ctrl); 
      toolTip1.Tag = null; 
     } 
    } 
} 

其工作e的組框但是當我把控件放在組框中時,它不起作用

我剛調試了代碼,並得到Form1_MouseMove事件不適用於Groupbox.basically內的控件var ctrl = parent.GetChildAtPoint( e.Location);它正在組合框的位置不是控件在組框中的位置

希望可以使用groupBox1_MouseHover ...有人用它來獲取組合框的控件。

+0

我剛剛調試了代碼,並得到Form1_MouseMove事件不適用於Groupbox.basically裏面的控件的工作。var ctrl = parent.GetChildAtPoint(e.Location);它正在組合框的位置而不是控件在組框中的位置 –

回答

0

你需要一些global MouseMove,試試用這樣的IMessageFilter;

public partial class Form1 : Form, IMessageFilter { 
    public Form1(){ 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 
    public bool PreFilterMessage(ref Message m){ 
    if(m.Msg == 0x200){//WM_MOUSEMOVE = 0x200 
     ShowToolTip(Control.FromHandle(m.HWnd)); 
    } 
    return false; 
    } 
    private void ShowToolTip(Control ctrl){ 
     if (ctrl != null && !ctrl.Enabled) 
     { 
      if (ctrl.Visible && toolTip1.Tag == null) 
      { 
       var tipstring = "My tooltip";// toolTip1.GetToolTip(ctrl); 
       toolTip1.Show(tipstring, ctrl, ctrl.Width/2, ctrl.Height/2); 
       toolTip1.Tag = ctrl; 
      } 
     } 
     else 
     { 
      ctrl = toolTip1.Tag as Control; 
      if (ctrl != null) 
      { 
       toolTip1.Hide(ctrl); 
       toolTip1.Tag = null; 
      } 
     } 
    } 
} 

注意:我想你原來的代碼工作確定。雖然我認爲這不好。

+0

..感謝您的代碼,但您在哪裏使用過PreFilterMessage ...如何使用該控件對其進行標記 –

+0

@RahulChowdhury'PreFilterMessage'未設計爲了「手動調用」,它由基礎類自動調用。你甚至還試過我的代碼嗎? –

+0

@RahulChowdhury我錯過了窗體構造函數中的代碼行,查看更新。我們需要'AddMessageFilter'。 –

0

GroupBox在父表單上吞下了MouseMove,因此@King King的全局MouseMove處理程序應該可以工作,但有點極端,因爲有一個更簡單的解決方案。

即使設計師不提供Groupbox上的MouseMove事件,它仍然存在。

負載只需添加或顯示事件(構造函數應該工作過)

groupBox.MouseMove += GroupBox_MouseMove; 

您還可以得到提示文本集最初(如設計師),並設置:

string toolTipString = toolTip.GetToolTip(control); 

如果你需要爲父窗體和組窗口一起工作,你可以將同一個事件處理程序添加到多個控件中。

相關問題