我想在将鼠标悬停在按钮上时显示工具提示,只要鼠标悬停在按钮上,工具提示就应该跟随鼠标。实现这一目标的正确方法是什么?
当我添加一个使用更新的鼠标位置调用 tooltip.Show(...) 的 MouseMove 事件时,它会极度闪烁,并且在鼠标静止时还会重绘工具提示。如果它是 OwnerDraw 工具提示,我可以看到默认的系统工具提示样式与自绘工具提示“战斗”。
我想在将鼠标悬停在按钮上时显示工具提示,只要鼠标悬停在按钮上,工具提示就应该跟随鼠标。实现这一目标的正确方法是什么?
当我添加一个使用更新的鼠标位置调用 tooltip.Show(...) 的 MouseMove 事件时,它会极度闪烁,并且在鼠标静止时还会重绘工具提示。如果它是 OwnerDraw 工具提示,我可以看到默认的系统工具提示样式与自绘工具提示“战斗”。
事实上,在 .Net 2.0 中,ToolTip 对象已被更改。在 2.0 之前,在 ToolTip 处于活动状态时或在某些其他情况下更改 ToolTip 文本时会出现一些不一致的问题。从 2.0 开始,每次发生可能影响当前活动的 Tooltip 的情况时,Tooltip 都会被隐藏。
虽然这解决了一些问题,但它现在会导致一些事件在例如 SetToolTip() 之后立即被触发,即使这个函数已经在这个事件中被调用,导致 ToolTip 绘制/隐藏的无限循环,直到鼠标移开工具提示区域。
我自己的解决方法是检查 ToolTip 是否已经相同,如果是则省略 Set ToolTip()。(简单地通过上面建议的静态标志省略下一个事件可能会导致问题,因为不能保证之后会有一个新事件,例如,如果鼠标刚刚接触到工具提示区域并已经移开)。
此外,仅使用 OnMouseHover 来显示 Tooltip 会禁用 ToolTip 组件的内部计时器功能,并导致许多不必要的事件,因此浪费处理器时间。ToolTip 组件的 Popup Event 可以很好地用作操作点。
然而,在这种特殊情况下,OnMouse Hover 是跟踪鼠标移动所必需的。无论如何,更改 ToolTip 位置会导致 Tooltip 完全重绘,因此会闪烁。通过检查鼠标位置是否在两个事件之间发生变化,可以减少静止鼠标的这种情况。不幸的是,ToolTip 组件无法更改 ToolTip 的位置,并且总是相对于当前鼠标位置显示。所以让它跟随鼠标的唯一方法是关闭并重绘它。
将 UseFading 和/或 UseAnimation 属性设置为 false 可能有助于进一步减少闪烁。
好的,这可能完全是矫枉过正,可能不是最好的解决方案,但我认为这是一个有趣的小技巧。
基本上,我在鼠标的位置绘制一个 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;
}
我注意到,当使用 OnMouseHover 手动显示工具提示时,在显示工具提示后再次调用 OnMouseMove 一次。作为一个黑客,我忽略了显示工具提示之后的下一个 OnMouseMove 调用(使用标志)。也许正在发生类似的现象?