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

本文关键字:显示 鼠标 移动 工具提示 | 更新日期: 2023-09-27 18:18:28

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

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

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"),但是没有显示工具提示。只有在我将鼠标再移动1个像素后,工具提示才会显示出来。这是一个问题,因为甜蜜点可以只有1像素宽,所以当鼠标从左到右移动到它上面时,工具提示不显示(它显示,当向上/向下移动…)

即使我没有检查位置是否真的发生了变化(我省略了e.location检查),工具提示也不会显示,直到我将鼠标再移动1个像素。

我注意到,如果我从不使工具提示处于不活动状态,它确实有效,但我不希望任何东西显示在甜蜜点之外…

这是怎么回事?

---------- edit --------------

更多信息:

当我将代码更改为这样(基本上总是显示工具提示,除了现在只有一个空格,当没有信息时),工具提示立即在最佳位置更新。缺点是,当没有数据显示时,我现在有一个空的工具提示,非常烦人。

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

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

看起来您缺少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;
                }
            }
        }
    }
}

我有一个非常相似的问题。我使用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);