如何在移动鼠标时隐藏工具提示

How to hide a tooltip when moving the mouse

我想调整 System.Windows.Forms.ToolTip 组件的行为:工具提示的内容非常大,而不是修改 AutoDelay 我想修改工具提示的行为:我希望在显示工具提示后用户移动他或她的鼠标时隐藏它,而不是在固定的时间后隐藏。无论鼠标的位置如何,我都希望这样做(此时鼠标光标甚至可能不在应用程序上方)。
如果这是可能的,我想知道是否有一种方法可以为表单中的所有工具提示完成此操作。

我尝试了什么?好吧,实际上并不多:我有工具提示,资源文件中有相应的文本:

private System.Windows.Forms.ToolTip toolTip1;
...
this.toolTip1.SetToolTip(this,
                         resources.GetString("$this.ToolTip"));

resx 文件:

    <data name="$this.ToolTip" xml:space="preserve">
      <value>There are two ways to use this application:
             ...

明确一点:我不想要工具提示的任何其他行为:位置、弹出所需的延迟……,一切正常。我只是想在鼠标移动之前将其保留在屏幕上。

是的,这是可能的。覆盖OnMouseMove方法来更新一个Point类型的class变量(比如说:lastPoint),使用当前的e.Location来创建并膨胀 Rectangle,如果矩形不包含 lastPoint,则隐藏工具提示。

public partial class YourForm : Form
{
    private Point lastPoint;

    public YourForm()
    {
        InitializeComponent();
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);

        if (lastPoint == Point.Empty)
            lastPoint = e.Location;
        else if (!new Rectangle(e.X - 16, e.Y - 16, 32, 32).Contains(lastPoint))
        {
            toolTip1.Hide(this);
            lastPoint = e.Location;
        }
    }    
}

更好的方法是子class ToolTip 组件以将其应用于支持工具提示功能的任何控件。

[DesignerCategory("Code")]
[ToolboxBitmap(typeof(ToolTip))]
public class ToolTipEx : ToolTip
{
    private Point lastPoint;

    public ToolTipEx() : base() { }

    public ToolTipEx(IContainer cont) : this() => cont.Add(this);

    /// <inheritdoc cref="ToolTip.SetToolTip(Control, string)"/>
    public new void SetToolTip(Control control, string caption)
    {
        base.SetToolTip(control, caption);
        control.MouseMove -= OnControlMouseMove;
        control.MouseMove += OnControlMouseMove;
    }

    private void OnControlMouseMove(object sender, MouseEventArgs e)
    {
        if (lastPoint == Point.Empty)
            lastPoint = e.Location;
        else if (!new Rectangle(e.X - 16, e.Y - 16, 32, 32).Contains(lastPoint))
        {
            Hide(sender as Control);
            lastPoint = e.Location;
        }
    }
}

您可以照常使用设计器在 design-time 处设置工具提示,也可以在运行时通过调用 .SetToolTip(..) 方法设置工具提示。