如何在移动鼠标时隐藏工具提示
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(..)
方法设置工具提示。
我想调整 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(..)
方法设置工具提示。