禁用控件工具提示在Windows窗体中的组框内无法正常工作?

时间:2013-10-09 07:33:11

标签: c# asp.net .net windows winforms

我正在尝试显示禁用控件的工具提示..我可以在表单鼠标移动事件中执行它,即使它工作正常

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

但是当我为组框内的控件执行此操作时,它无法正常工作..

需要帮助

我正在使用的代码..

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

当我将控件放在组合框之外时它正在工作但是当我将控件放在组合框中时它无法正常工作

我刚刚调试了代码并使Form1_MouseMove事件无法用于Groupbox内的控件。基本上var ctrl = parent.GetChildAtPoint(e.Location);它取组框的位置而不是组框内控件的位置

希望可以使用groupBox1_MouseHover ...有人用它来获取组框控件。

2 个答案:

答案 0 :(得分: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;
            }
        }
   }
}

注意:我认为您的原始代码正常。虽然我认为这不好。

答案 1 :(得分:0)

GroupBox吞下父窗体上的MouseMove,因此@King King的全局MouseMove处理程序应该可以工作,但是有一个更简单的解决方案。

即使设计师没有在组合框中提供MouseMove事件,它就在那里。

只需添加加载或显示的事件(构造函数也应该工作)

groupBox.MouseMove += GroupBox_MouseMove;

您还可以获取最初设置的工具提示文本(例如在设计器中)并设置:

string toolTipString = toolTip.GetToolTip(control);

如果您需要同时使用父窗体和组合框,则可以将相同的事件处理程序添加到多个控件。