C# winform 控件关于控件在不同分辨率下位置偏移问题(看描述)

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

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

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

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

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

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

我要回帖

更多关于 winform 控件 的文章

 

随机推荐