用于图片框和图像映射的工具提示

时间:2012-08-16 08:59:46

标签: c# winforms tooltip picturebox mousemove

我有PictureBox分配了一个地图(基本上是Rectangle个对象的列表)。现在我希望如果用户将鼠标移到此图片框上,并且如果鼠标位于列表中存在的矩形上,则会弹出工具提示并显示一些信息。

映射工作正常,但问题是ToolTip变得疯狂并且没有正确显示,它只是继续弹出任何鼠标移动。我怎么编码它只会在鼠标位于矩形时弹出?

这是我的代码,你看到了这个例子!

private void pictureBoxPackageView_MouseMove(object sender, MouseEventArgs e)
{
    if (PackageMap == null || PackageMap.Count == 0) return;
    var point = new Point(e.X, e.Y);

    foreach (var map in PackageMap)
    {
        if (map.Rectangle.Contains(point))
        {
            var tip = new ToolTip();
            tip.ToolTipTitle = map.Pin.Group;
            tip.Show("Result: " + map.Pin.Mk2Result, pictureBoxPackageView, point, 200);
            break;
        }
    }
}

enter image description here

2 个答案:

答案 0 :(得分:3)

它会不断弹出,因为您只检查光标是否在矩形内。请记住,您仍然可以移动鼠标几次但仍然在该矩形内。

我认为您想要的是在输入矩形时仅弹出工具提示一次。 您应该记住鼠标的先前位置。如果当前位置在矩形内,请检查先前位置是否在同一矩形内。这是显示工具提示否则通过的时间。

答案 1 :(得分:3)

我会添加一个自定义侦听器来检测您希望显示不同工具提示的每个单独矩形容器的MouseEnter事件和MouseLeave事件,添加代码以显示X秒的工具提示MouseEnter(使用Show()方法显示)。如果用户将光标保持在矩形内,它将继续显示那些X秒(使用AutoPopDelay属性在这些X秒后自动隐藏)。如果用户将光标移出,则MouseLeave事件应使用Hide()方法。

我还会设置一秒延迟,以便在您将光标一次移动到多个区域时保持多个工具提示不会打开。请使用InitialDelay属性。

应该看起来像这样(不显示正确设置的属性):

private void area1_MouseEnter(object sender, EventArgs e)
{
    tooltip.Show("text to display", window);
}

private void area1_MouseLeave(object sender, EventArgs e)
{
    tooltip.Hide(window);
}

我要去的路径是扩展你正在使用的容器并将这些监听器添加到自定义容器类中,特别是如果你要创建几个都需要这个功能的类似容器。