C# 如何使用鼠标移动工具提示(winforms)

C# 如何使用鼠标移动工具提示(winforms),c#,winforms,tooltip,mouseevent,C#,Winforms,Tooltip,Mouseevent,我希望它在鼠标移动时移动,当指针不在标签上时消失 这不起作用: private void lblRevisionQuestion_MouseMove(object sender, MouseEventArgs e) { toolTip1.Show("test", this, PointToClient(MousePosition), Int32.MaxValue); } private void lblRevisionQuestion_MouseLeave(object sender,

我希望它在鼠标移动时移动,当指针不在标签上时消失

这不起作用:

private void lblRevisionQuestion_MouseMove(object sender, MouseEventArgs e)
{
    toolTip1.Show("test", this, PointToClient(MousePosition), Int32.MaxValue);
}

private void lblRevisionQuestion_MouseLeave(object sender, EventArgs e)
{
    toolTip1.Hide(this);
}
工具提示一出现,就会将焦点从窗体上偷走,引发鼠标移动。然后工具提示隐藏,指针再次位于标签上方,调用MouseMove。这将导致出现一个断断续续、闪烁的工具提示

有没有办法做到这一点

toolTip1.Show(_toolTipText, this, new Point(lblRevisionQuestion.Left + e.X + 1, lblRevisionQuestion.Top + e.Y + 1), int.MaxValue);

奇怪的是,当我在早期尝试将其显示到任意坐标时,它遇到了与上面相同的问题。我不知道为什么这样做有效,而那样做无效。

由于您使用的是列表视图,我想提醒您,listview项具有一些特定于工具提示的属性,如ToolTipText。这将使您在将鼠标悬停在项目上时更容易显示数据,如下所示

toolTip1.ToolTipTitle = string.Format("Item: {0}",e.Item.Text);
toolTip1.Show(e.Item.ToolTipText,listView1);
toolTip1.ShowAlways = true;
我就是这样做的:

MyToolTip.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

public class MyToolTip : ToolTip
{
    public MyToolTip()
    {
        OwnerDraw = true;
        Draw += MyToolTip_Draw;
    }

    private void MyToolTip_Draw(object sender, DrawToolTipEventArgs e)
    {
        using (StringFormat sf = new StringFormat())
        {
            sf.Alignment = StringAlignment.Center;
            sf.LineAlignment = StringAlignment.Center;
            sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.None;
            sf.FormatFlags = StringFormatFlags.NoWrap;
            using (Font f = new Font("Arial", 7.5F))
            {
                SizeF s = new SizeF();
                s = e.Graphics.MeasureString(e.ToolTipText, f);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(225, 225, 245)), e.Bounds);
                e.DrawBorder();
                e.Graphics.DrawString(e.ToolTipText, f, SystemBrushes.ActiveCaptionText, e.Bounds, sf);
            }
        }
    }

}
在类中的某个位置使用它:

private MyToolTip ttp;
private int LastX;
private int LastY;
public string Caption { get; set; }

private void MyObjectWhichNeedsMovingToolTip_MouseLeave(object sender, EventArgs e)
{
    ttp.Hide(this);
}

private void MyObjectWhichNeedsMovingToolTip_MouseMove(object sender, MouseEventArgs e)
{
    // This is for stop flickering tooltip
    if (e.X != this.lastX || e.Y != this.lastY)
    {
        // depending on parent of the object you must add or substract Left and Top information in next line
        ttp.Show(Caption, this, new Point(MyObjectWhichNeedsMovingToolTip.Left + e.X + 10, MyObjectWhichNeedsMovingToolTip.Top + e.Y + 20), int.MaxValue); 

        this.lastX = e.X;
        this.lastY = e.Y;
    }
}
结果是:


对于给定的代码,工具提示窗口将精确显示在鼠标位置。这会导致闪烁。抵消一点。