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

C# 将Windows窗体工具提示锚定到鼠标,c#,mouse,tooltip,onmousemove,C#,Mouse,Tooltip,Onmousemove,我想在鼠标悬停在按钮上时显示工具提示,只要鼠标悬停在按钮上,工具提示就应该跟随鼠标。实现这一目标的正确方法是什么 当我添加一个调用tooltip.Show(…)的MouseMove事件并更新鼠标位置时,它会闪烁异常,并且在鼠标静止时还会重新绘制工具提示。如果它是OwnerDraw工具提示,我可以看到默认的系统工具提示样式“战斗”和自画工具提示。我注意到,当手动显示带有onmousehave的工具提示时,OnMouseMove会在工具提示显示后再次被调用。作为黑客,我忽略了显示工具提示(使用标志)

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


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

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

好的,这可能是完全的过度,可能不是最好的解决方案,但我认为一个有趣的小技巧是不容易的

基本上,我在鼠标位置绘制一个列表视图。一些代码:

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;
        }

事实上,在.NET2.0中,工具提示对象已被更改。在2.0之前,当工具提示处于活动状态时更改工具提示文本时,或在某些其他情况下,会出现一些不一致的问题。 自2.0以来,每次发生可能影响当前活动工具提示的事件时,工具提示都会隐藏

虽然这解决了一些问题,但现在会导致一些事件在紧接着启动,例如SetToolTip(),即使此函数已在此事件中调用,也会导致工具提示绘制/隐藏的无休止循环,直到鼠标离开工具提示区域

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

另外,使用onmousehave仅显示工具提示会禁用工具提示组件的内部计时器功能,并导致许多不必要的事件,因此会浪费处理器时间。工具提示组件的弹出事件也是行动点

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


将UseFacing和/或UseAnimation属性设置为false可能有助于进一步减少闪烁。

我发现在同一位置进行测试消除了我的闪烁和其他问题Mgross的答案是正确的,您必须正确标记-1对于未标记正确答案:(