C#在同一个控件的不同位置显示提示信息

问题描述

  年前碰到个需求,要在控件上显示指定的图形,然后鼠标移动到图形的不同位置就显示不同的信息。
  开始以为鼠标移动显示信息这个比较简单,就是鼠标悬停的时候获取当前鼠标位置,然后计算图形在当前位置上的信息,最后用ToolTip组件显示出来就可以了。
  但是实际写代码的时候发现不是这么回事!!!
  下面的案例都是演示代码

解决方案一:在MouseHover事件中处理

  看到需求的时候第一时间想到的就是在MouseHover中处理,用户鼠标移动的过程中不处理,等他把鼠标停在某个位置的时候,触发MouseHover事件,然后获取要处理的信息,最后显示出来。
  第一个问题是控件的MouseHover事件处理函数中没有将当前鼠标位置传过来,该事件处理函数的声明如下:
private void ucDrawBoard_MouseHover(object sender, EventArgs e)
  事件参数就是普通的EventArgs,不过这不影响获取当前鼠标位置,可以使用Control.MousePosition属性获取当前鼠标位置,该位置是鼠标在屏幕上的位置,需要调用控件的PointToClient函数将坐标转换到当前控件内的坐标。
  第二个问题是MouseHover事件无法频繁触发。通过测试发现,鼠标从外部进入到控件内部后只能触发一次MouseHover事件,如果想再次触发,必须要将鼠标移出控件再进来。
  这导致第一个方案无法实施,只能另寻他法。

解决方案二:在MouseMove事件中处理

  肯定还是要从控件的各种鼠标事件中实现定位、显示信息的功能,如果MouseHover不行的话,那就是在MouseMove事件,其它鼠标事件都需要用户进行额外的动作。
  MouseMove的事件处理函数中会传入当前鼠标位置,剩下的就是进行定位和信息显示,这个在方案一中由现成的代码,可以直接复用。
  需要注意的问题有两个:
  1)何时进行定位。并不是每次触发鼠标移动事件都需要定位。因为鼠标的移动的过程中用户不希望看到信息,而是在鼠标在某位置停留的时候才会显示,这时鼠标移动事件还在触发,但是鼠标位置一直没有变化,可以将此作为定位及显示信息的前提条件。
  2)何时进行信息显示。并不是每次鼠标停了之后都要显示信息。有可能鼠标在同一个区域内停了两次,显示的信息都是一样的,只是当前鼠标位置不同而已,这个要根据实际需要是信息位置不变还是根据鼠标移动。

示例代码地址:https://github.com/guochao2299/ToolTipTest

猜你喜欢

转载自blog.csdn.net/gc_2299/article/details/79355810