【问题标题】:Disabled control Tooltip not working inside Group box in Windows form?禁用的控件工具提示在 Windows 窗体的组框中不起作用?
【发布时间】:2013-10-09 07:33:11
【问题描述】:

我正在尝试显示禁用控件的工具提示..即使它工作正常,我也可以在鼠标移动事件中做到这一点

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 来实现...有没有人用它来控制组框。

【问题讨论】:

  • 我刚刚调试了代码,发现 Form1_MouseMove 事件不适用于 Groupbox 中的控件。基本上 var ctrl = parent.GetChildAtPoint(e.Location);它采用的是 groupbox 的位置,而不是 group box 内控件的位置

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


【解决方案1】:

你需要一些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;
            }
        }
   }
}

注意:我想您的原始代码可以正常工作。虽然我觉得不好。

【讨论】:

  • ..感谢您的代码,但您在哪里使用 PreFilterMessage...如何使用该控件对其进行标记
  • @RahulChowdhury PreFilterMessage 不是为call manually 设计的,它由底层类自动调用。你试过我的代码了吗?
  • @RahulChowdhury 我错过了表单构造函数中的代码行,请参阅更新。我们需要AddMessageFilter
  • 感谢您的回复...但它不起作用..我在一个组框中取了两个按钮。在表单加载中我把 button.Enable=false..然后我做你在这里做的任何事情。 .
  • 我已经调试过了...它没有进入 if (ctrl != null && !ctrl.Enabled) 条件.. m.Msg == 0x200 有什么用?跨度>
【解决方案2】:

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

即使设计器没有在 groupbox 上提供 MouseMove 事件,它仍然存在。

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

groupBox.MouseMove += GroupBox_MouseMove;

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

string toolTipString = toolTip.GetToolTip(control);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多