将 Windows 窗体工具提示锚定到鼠标
Posted
技术标签:
【中文标题】将 Windows 窗体工具提示锚定到鼠标【英文标题】:Anchoring a Windows Forms Tooltip to the mouse 【发布时间】:2010-09-29 20:34:40 【问题描述】:我想在鼠标悬停在按钮上时显示工具提示,只要鼠标悬停在按钮上,工具提示就应该跟随鼠标。实现这一目标的正确方法是什么?
当我添加一个使用更新的鼠标位置调用 tooltip.Show(...) 的 MouseMove 事件时,它会极度闪烁,并在鼠标静止时重绘工具提示。如果它是 OwnerDraw 工具提示,我可以看到默认的系统工具提示样式与自绘工具提示“战斗”。
【问题讨论】:
JMGross的答案是对的,一定要标对!! -1 未标记正确答案 :( 【参考方案1】:确实,在 .Net 2.0 中,ToolTip 对象已被更改。在 2.0 之前,在 ToolTip 处于活动状态时或在某些其他情况下更改 ToolTip 文本时会出现一些不一致的问题。 从 2.0 开始,每次发生可能影响当前活动的 Tooltip 的情况时,Tooltip 都会被隐藏。
虽然这解决了一些问题,但它现在会导致一些事件在例如之后立即被触发。一个 SetToolTip(),即使在这个事件中调用了这个函数,也会导致 ToolTip 绘制/隐藏的无限循环,直到鼠标离开 ToolTip 区域。
我自己的解决方法是检查 ToolTip 是否已经相同,如果是则省略 Set ToolTip()。 (如上面建议的那样通过静态标志简单地省略下一个事件可能会导致问题,因为不能保证之后会有一个新事件,例如,如果鼠标刚刚触摸工具提示区域并已经移开)。
此外,仅使用 OnMouseHover 来显示 Tooltip 会禁用 ToolTip 组件的内部计时器功能,并导致许多不必要的事件,从而浪费处理器时间。 ToolTip 组件的 Popup Event 非常适合作为操作点。
然而,在这种特殊情况下,OnMouse Hover 是跟踪鼠标移动所必需的。 无论如何,更改 ToolTip 位置会导致 Tooltip 完全重绘,因此会闪烁。通过检查鼠标位置是否在两个事件之间发生变化,可以减少静止鼠标的这种情况。 不幸的是,ToolTip 组件无法更改 ToolTip 的位置,并且总是相对于当前鼠标位置显示。所以让它跟随鼠标的唯一方法就是关闭并重绘它。
将 UseFading 和/或 UseAnimation 属性设置为 false 可能有助于进一步减少闪烁。
【讨论】:
我发现对同一位置进行测试消除了我的闪烁和其他问题【参考方案2】:好吧,这可能完全是矫枉过正,可能不是最好的解决方案,但我认为这是一个有趣的小技巧。
基本上,我在鼠标的位置绘制一个 ListView。一些代码:
ListView v = new ListView();
public Form1()
InitializeComponent();
v.Items.Add("Foo");
v.Height = 30;
v.Width = 50;
this.button1.Controls.Add(v);
v.MouseMove += new MouseEventHandler(v_MouseMove);
v.BackColor = SystemColors.Info;
this.button1.MouseMove += new MouseEventHandler(button1_MouseMove);
void v_MouseMove(object sender, MouseEventArgs e)
v.Location = new Point(v.Location.X + e.Location.X, v.Location.Y + e.Location.Y);
void button1_MouseMove(object sender, MouseEventArgs e)
v.Location = e.Location;
【讨论】:
【参考方案3】:我注意到,当使用 OnMouseHover 手动显示工具提示时,OnMouseMove 会在显示工具提示后再次调用一次。作为一个黑客,我忽略了显示工具提示之后的下一个 OnMouseMove 调用(使用标志)。也许正在发生类似的现象?
【讨论】:
以上是关于将 Windows 窗体工具提示锚定到鼠标的主要内容,如果未能解决你的问题,请参考以下文章
如何将 UIAlertController 操作表锚定到特定单元格 UICollectionView?