2

我想在将鼠标悬停在按钮上时显示工具提示,只要鼠标悬停在按钮上,工具提示就应该跟随鼠标。实现这一目标的正确方法是什么?

当我添加一个使用更新的鼠标位置调用 tooltip.Show(...) 的 MouseMove 事件时,它会极度闪烁,并且在鼠标静止时还会重绘工具提示。如果它是 OwnerDraw 工具提示,我可以看到默认的系统工具提示样式与自绘工具提示“战斗”。

4

3 回答 3

10

事实上,在 .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 可能有助于进一步减少闪烁。

于 2009-05-14T15:32:10.937 回答
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;
        }
于 2009-01-06T17:05:39.480 回答
0

我注意到,当使用 OnMouseHover 手动显示工具提示时,在显示工具提示后再次调用 OnMouseMove 一次。作为一个黑客,我忽略了显示工具提示之后的下一个 OnMouseMove 调用(使用标志)。也许正在发生类似的现象?

于 2009-01-06T16:51:48.433 回答