WinForm中MouseEnter和MouseLeave混乱的问题

摘要:
因此,使用进入和离开这两个事件是很自然的。尝试在进入控件一定距离后添加边框,并触发删除边框(请参见上面的代码,我添加了边,1)PointToClient计算指定屏幕点的位置作为工作空间坐标:2)PointToScreen计算指定工作空间点的位置为屏幕坐标;在许多情况下,我们需要使用鼠标相对于窗体的坐标:返回的Point类型对象是鼠标相对于控件的坐标。

  MouseEnter+MouseLeave不行,我用了MouseMove+MouseLeave,效果一样

  最近做个聊天的系统,仿照qq的界面设计,像qq聊天界面中字体、表情、截图等图片,鼠标放上去显示边框,所以很自然用到了enter和leave这两个事件,因为是picturebox控件没有over和out事件,但调了两个小时就是不行,mouseleave事件不灵,经常不触发,也不是速度太快造成的,因为有时快也能触发,我慢慢经过反倒经常不触发,头疼,因为我这些图片外面套的有两层panel,网上查了些资料看了,说鼠标在控件上也算不在panel上,但和我的情况不符合呀,整了一下午不行,放弃(最后终于知道是因为Leave是在离开控件边缘的一瞬间触发,但我进入控件后加了边框,所以鼠标离开控件边缘时,是在后加上的边框上,依然认为在控件里,导致慢慢经过边缘不触发,但Enter事件不能控制,所以还得用下面的);

  没办法开始尝试用判断鼠标是否在控件上这个方法,这里用到的是mousemove事件,这里也有坑,什么相对于屏幕的坐标和相对于窗口的,也是整的有点云里雾里的。先看下最终实现的效果,:

  private void picBoxLog_MouseMove(object sender, MouseEventArgs e)
        {
            Point p = flowLayoutPanel2.PointToClient(Control.MousePosition);//flowLayoutPanel2是picBoxLog的父容器
            int side = 1;//决定于边框的宽度
            if (p.X > picBoxLog.Location.X + side && p.X < picBoxLog.Location.X + picBoxLog.Width - side && p.Y > picBoxLog.Location.Y + side && p.Y < picBoxLog.Location.Y + picBoxLog.Height - side)
            {
                picBoxLog.BorderStyle = BorderStyle.FixedSingle;
            }
            //else
            //    picBoxLog.BorderStyle = BorderStyle.None;
        }

开始只用move,但移出控件上就不触发该事件,所以不会去掉边框,尝试鼠标进入控件过一段距离后加边框,四周留一些边距,触发去掉边框(看上面的代码我加了side就知道了,所以大家就不用加side了),但如果移动过快也会造成去不掉的情况,虽然不容易发生,而且控件本来就30高度没多大,我两边都留了8,还是会发生,再多点就没了,灵光一闪,把去掉边框的方法,又放到了Leave事件中,日了狗了,这两个事件竟完美配合,想砸键盘的心都有了,所以记录下来,献给正在为此砸键盘或将来可能砸键盘的猿猿们。

贴一下用这个方法过程中查看的知识点:

1)PointToClient 将指定屏幕点的位置计算成工作区坐标。坐标原点为黄色区域左上角,X轴方向从左到右;Y轴方向从上到下;坐标单位为像素;

2)PointToScreen 将指定工作区点的位置计算成屏幕坐标。坐标原点在屏幕左上角,X轴方向从左到右;Y轴方向从上到下;坐标单位为像素;

获取鼠标的位置的:

  很多时候我们需要用到鼠标在相对于窗体上的坐标,或者相对于屏幕的坐标,这里就把我的经验记录下。

  用Control.MousePosition获得当前鼠标的坐标CurrentPoint,使用Control.PointToClient方法,前面获得的CurrentPoint作为其参数,返回的Point类型的对象即为鼠标相对于某个控件的坐标。

现在以鼠标相对于窗体的坐标做为例子,如下:   

          Point screenPoint = Control.MousePosition;//鼠标相对于屏幕左上角的坐标           

   Point formPoint = this.PointToClient(Control.MousePosition);//鼠标相对于窗体左上角的坐标

同理:

            Point button1Point= button1Point.PointToClient(Control.MousePosition); //鼠标相对于button1左上角的坐标

还有Control.PointToScreen方法,返回的是相对于屏幕的坐标。

    大概就这些吧,中间还试了Rectangle相关的,没成功,不知道是不是哪写错了,哪位大神知道了,可以指点下

    //Rectangle rec = picBoxLog.RectangleToClient(this.ClientRectangle);
            //Point p = flowLayoutPanel2.PointToClient(Control.MousePosition);  flowLayoutPanel2是picBoxLog的父容器,改成this也试了不行
            //if (rec.Contains(p))
            //{
            //    picBoxLog.BorderStyle = BorderStyle.FixedSingle;
            //}
            //else
            //    picBoxLog.BorderStyle = BorderStyle.None; 

免责声明:文章转载自《WinForm中MouseEnter和MouseLeave混乱的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SpringBoot 2.x 整合Lombok基于java容器注解---基于泛型的自动装配下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windows8 游戏开发教程一、Metro UI 和绘图

仔细想了想,叫做教程似乎不太合适,应该算作一种讨论。 windows 8 已经玩了一段日子,相信大家对Metro UI已经不陌生了。 Metro UI的介绍 我想很简单就可以带过了。 首先是布局方式,采用XAML布局,虽然外观看起来简单过了头,这是从zune 和wp7 那里继承来的风格。 没有窗口概念,取而代之的是Page。下一层次是控件,容器控件可以放子...

C#+Winform开发窗体程序

第一章:WinForm基础 一、概述 1、Windows Form(简称WinForm) 是微软.NET平台下用于开发"图形界面"应用程序的组件。   2、C/S架构 客户机(Client)/服务器(Server),是软件系统体系结构。 通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。  ...

【九天教您南方cass 9.1】 09 提取坐标的几种方法

同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天。 我们讲课的教程附件也是共享的,请注意索取测量空间中。 【点击索取cass教程】5元立得 (给客服说暗号:“老王测量上班记”) 即可5元获得教程全系列,不带软件安装 这节课我们学习Cass9.1提取坐标的几种方法。   方法1 有编码高程点生成 方法2  无编码高...

解决C#编译中"csc不是内部或外部命令"的问题

安装完 VisualStudio 编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示“csc不是内部或外部命令,也不是可运行的程序,或批处理文件”。这时只需配置好环境变量,就可以成功执行csc命令编译C#源码了。使用记事本编写一个C#程序,保存后将扩展名改为cs,存储在D...

android:onTouch()和onTouchEvent()的区别?看完这篇文章就知道了

Android Touch Screen 与传统Click Touch Screen不同,会有一些手势(Gesture),例如Fling,Scroll等等。这些Gesture会使用户体验大大提升。 Android中的Gesture识别(detector)是通过GestureDetector.OnGestureListener接口实现的。 首先,Androi...

微信小程序全屏背景图适配

需求:一张全屏背景图适配不同手机屏幕,图片不变形不裁剪 方案:填充色+图片。其他方案不太行。其他方案参考微信社区:https://developers.weixin.qq.com/community/develop/doc/000eee514f8908ed7d5aef55e51400 #EF1739是填充色,背景图片大小按照设计图写死,布局从上往下,区中...