工具提示仅在移动鼠标后显示

时间:2014-08-18 20:16:34

标签: c# winforms tooltip

我在使用mousemove事件显示工具提示时遇到了一些麻烦。基本上,我想在我的鼠标指针位于图片框的某些区域时显示工具提示。我尝试使用mousemove事件完成此操作,确定指针位于最佳位置,并且(如果是)使用settooltip设置工具提示。

这是我的mousemove事件(因为我注意到当显示工具提示时,鼠标移动会被连续触发,我会检查位置是否真的改变了)

private void pbFaseFlow_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Location != OldPosition)
    {
        OldPosition = e.Location;

        // determine text for tooltip (gets loaded into a global string)
        DetermineText(Position);

        // show the coords and tooltip text for debugging in some textbox
        tbInfo.Text = e.X.ToString() + " " + e.Y.ToString() + " " + ToolTipText;

        // show tooltip
        if (ToolTipText != string.Empty)
        {
            toolTip.SetToolTip(pbFaseFlow, ToolTipText);
            toolTip.Active = true;
        }
        else
        {
            toolTip.Active = false;
        }
    }
}

这种方法很好,除非我将鼠标移动到第一个像素的最佳位置。在我的文本框中,我可以看到正在确定文本(例如" test" f.e.),但工具提示没有显示。只有在我移动鼠标1个像素后,才会显示工具提示。这是一个问题,因为在甜点上只有1个像素宽,所以当从左到右移动鼠标时它显示工具提示(它显示,当向上/向下移动时..)

即使我没有检查真正改变的位置,(我省略了电子位置检查),直到我将鼠标移动1个像素才会显示工具提示。

我注意到,如果我从未使工具提示无效,它确实有效,但我不想在甜点外面显示任何内容..

这里发生了什么?

----------编辑--------------

更多信息:

当我将代码更改为此时(基本上始终显示工具提示,除非现在只有一个空格,当没有信息时),工具提示会立即更新。缺点是我现在有一个空的工具提示,显示没有数据显示的时候,非常讨厌。

            // show tooltip
            if (ToolTipText != string.Empty)
            {
                toolTip.Active = true;
                toolTip.SetToolTip(pbFaseFlow, ToolTipText);
            }
            else
            {
                toolTip.Active = true;
                ToolTipText = " ";
                toolTip.SetToolTip(pbFaseFlow, " ");
            }

2 个答案:

答案 0 :(得分:1)

您似乎缺少toolTip.Show()方法。

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Point OldPosition = new Point(0, 0);
        private Point ptSweetSpot = new Point(30, 30);
        private List<Point> sweetPointArea = new List<Point>() 
            { new Point(60, 60), new Point(60, 61), 
              new Point(61, 60), new Point(61, 61)
            };

        public Form1()
        {
            InitializeComponent();

            pbFaseFlow.MouseMove += pbFaseFlow_MouseMove;

            //just to see it on pictureBox
            Bitmap myBitmap = new Bitmap(pbFaseFlow.Height, pbFaseFlow.Width);
            myBitmap.SetPixel(ptSweetSpot.X, ptSweetSpot.Y, Color.Red);

            foreach (Point p in sweetPointArea)
            {
               myBitmap.SetPixel(p.X, p.Y, Color.Green);
            }

            pbFaseFlow.Image = myBitmap;
        }
        private void pbFaseFlow_MouseMove(object sender, MouseEventArgs e)
        {
            if (!e.Location.Equals(OldPosition))
            {
                OldPosition = e.Location;

                // show the coords and tooltip text for debugging in some textbox
                tbInfo.Text = e.X.ToString() + " " + e.Y.ToString();

                //are we inside sweet area?
                if (sweetPointArea.Contains(e.Location))
                {
                    toolTip.Active = true;
                    toolTip.SetToolTip(pbFaseFlow, "hello from sweet area!");
                    toolTip.Show(toolTip.GetToolTip(pbFaseFlow), pbFaseFlow, pbFaseFlow.Width / 2, pbFaseFlow.Height / 2);
                }
                //no? so maybe we're over sweet spot?
                else if (e.Location.Equals(ptSweetSpot)) 
                {
                    toolTip.Active = true;
                    toolTip.SetToolTip(pbFaseFlow, "hello from sweet point!");
                    toolTip.Show(toolTip.GetToolTip(pbFaseFlow), pbFaseFlow, pbFaseFlow.Width / 2, pbFaseFlow.Height / 2);                }
                //no? ok, so disable tooltip
                else
                {
                    toolTip.Active = false;
                }
            }
        }
    }
}

答案 1 :(得分:0)

我有一个非常类似的问题。我正在使用TrackMouseEvent()重新启用MouseHover,因此我不必将鼠标移出控件并返回以获取另一个悬停事件以触发工具提示。

第一次正常工作但后续尝试显示工具提示不会发生,直到鼠标移动1个像素。

我的解决方法是两次致电Show()。我还需要稍微偏离鼠标位置的工具提示。

toolTip1.Show("Hi There", Parent, e.X + 5, e.Y + 5, 2000);
toolTip1.Show("Hi there", Parent, e.X + 5, e.Y + 5, 2000);