将Windows窗体工具提示锚定到鼠标

时间:2009-01-06 16:45:43

标签: c# mouse tooltip onmousemove

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

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

3 个答案:

答案 0 :(得分:10)

实际上,使用.Net 2.0,ToolTip对象已被更改。在2.0之前,当ToolTip处于活动状态或其他一些情况时更改ToolTip文本时会出现一些不一致问题。 从2.0开始,每当发生可能影响当前活动的工具提示的事件时,工具提示都会隐藏。

虽然这解决了一些问题,但它现在导致一些事件在例如一个SetToolTip(),即使从这个事件中调用了这个函数,也会导致无限循环的ToolTip绘制/隐藏,直到鼠标离开ToolTip区域。

我自己的解决方法是检查工具提示是否已经相同,如果是,则省略Set ToolTip()。 (如上所述,通过静态标志省略下一个事件可能会导致问题,因为无法保证之后会有新事件发生,例如,如果鼠标刚刚触及ToolTip区域并已移走)。

此外,使用OnMouseHover仅显示工具提示会禁用ToolTip组件的内部计时器功能,并导致许多不必要的事件,从而浪费处理器时间。 ToolTip组件的Popup事件很适合作为操作点。

但是,在这种特殊情况下,OnMouse Hover是跟踪鼠标移动所必需的。 无论如何,改变ToolTip位置会导致Tooltip的完全重绘,从而导致闪烁。通过检查鼠标位置是否在两个事件之间发生了变化,可以减少静止鼠标的速度。 不幸的是,ToolTip组件无法更改ToolTip的位置,adn始终相对于当前鼠标位置显示。所以让它跟随鼠标的唯一方法是关闭并重绘它。

它可能有助于将UseFading和/或UseAnimation属性设置为false,因此可以进一步减少闪烁。

答案 1 :(得分: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;
        }

答案 2 :(得分:0)

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