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混乱的问题的更多相关文章

  1. WPF和Winform中picturebox图片局部放大

    原文:WPF和Winform中picturebox图片局部放大 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/artic ...

  2. mouseenter以及mouseleave兼容性

    在IE的全系列中都实现了mouseenter和mouseleave事件,但是在早期的w3c浏览器中却没有实现这两个事件.有时候,我们需要使用 mouseenter事件来防止子元素的冒泡,这就涉及到事件 ...

  3. ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave由于鼠标移动速度过快导致问题解决办法

    记录两个项目开发中遇到的问题,一个是ECharts外部调用保存为图片操作,一个是workflow工作流连接曲线onmouseenter和onmouseleave事件由于鼠标移动过快触发问题. 一.外部 ...

  4. mouseover和mouseout、mouseenter和mouseleave

    又一个傻傻分不清楚的东东~ 现实真是一个问题天天有的世界~本以为我对js中的事件还是比较了解的,对于早就接触的mouse事件,更是觉得得心应手了~但是现实却给了我一记重拳! 我自身工作中遇到的犯二的故 ...

  5. 第二十七课:滚轮事件,mouseenter与mouseleave事件的修复

    滚轮事件 jQuery核心库没有对mousewheel事件的差异性进行处理,但作为一个常用的事件,本文讲解一下. mousewheel事件只有火狐浏览器不支持.mousewheel用于取得滚动距离的属 ...

  6. mouseover,mouseout,mouseenter,mouseleave的区别

    相信做前端开发的都听说过“冒泡型事件”吧,<JavaScript高级程序设计>第九章有详细的讲述,但是,在学习的时候一知半解,也没详细去理解,导致最近在工作中碰到了问题:有许多 li 标签 ...

  7. mouseover,mouseout与mouseenter,mouseleave

    针对单个元素,使用感一样. 差异提现在有子元素的情况下: mouseover和mouseout在父元素和其子元素都可以触发,当鼠标穿过一个元素时,触发次数得依子元素数量而言. mouseenter和m ...

  8. mouseover、mouseout和mouseenter、mouseleave

    这里直接把<Javascript 高级程序设计(第三版)>中的解释贴出来: mouseover:在鼠标指针位于一个元素外部,然后用户将其首次移入另一个元素边界之内时触发.不能通过键盘触发这 ...

  9. mouseout和mouseover、mouseenter和mouseleave

          在前端开发中经常会碰到当鼠标放到一个元素上时会弹出你一个元素,鼠标离开那个弹出元素后隐藏.这类效果一般要用到一些鼠标事件,一类是mouseout和mouseover,另一类是mouseen ...

随机推荐

  1. sublime text3 前端编译神器,浏览器实时显示

    前端编译器有很多,Dreamweaver,sublime text ,webstorm,但在使用之后感觉sublime text3就是前端的编译神器 首先sublime text3最好使用英文原版,虽 ...

  2. 在Ubuntu 12.04下采用apt-get的方法安装Qt4

    在Ubuntu 12.04下采用apt-get的方法安装Qt4 注:之前发表的一篇博客是采用编译源码的方式安装Qt4,这是很有用的方式,因为源码安装对于所有系统都是通用的,其次,在使用交叉编译器的时候 ...

  3. 论文阅读(Weilin Huang——【TIP2016】Text-Attentional Convolutional Neural Network for Scene Text Detection)

    Weilin Huang--[TIP2015]Text-Attentional Convolutional Neural Network for Scene Text Detection) 目录 作者 ...

  4. 关于成为Java高级工程师之路

    简单说明一下现状,个人目前学习使用java已经一年半,很迷茫,高不成低不就,在此列一个目标,为期18个月,再来个一年半,这样软件生涯三年后,我必须成为高级工程师! 这里涉及Java各个方面的知识,有的 ...

  5. sql经常会遇到“将截断二进制或字符串”的错误——处理办法

    sql经常会遇到“将截断二进制或字符串”的错误——处理办法 1.修改列长度——无法定位具体字段 2.程序逻辑中增加判断,以定位具体字段 由于我是在报表数据库中直接写SQL,没有校验逻辑,所以想把全部字 ...

  6. gTest详解

    1. 安装使用 1.1 安装 在https://code.google.com/p/googletest/ 下载源码 进入msvc, 注意编译方式, 如果是dll, 选择 gtest-md 编译生成l ...

  7. MATLAB绘图

    matlab绘制散点图 clc,clear x=[11.9,11.5,14.5,15.2,15.9,16.3,14.6,12.9,15.8,14.1]; y=[196.84,196.84,197.14 ...

  8. dll 日志文件 放在同一个目录。

    string strPath = "log.txt"; 如果日志问价跟dll文件放在一起,直接这么些就可以了.

  9. php常用函数(持续中)

    字符串 折分字符串:split和explode 函数原型:array split (string $pattern, string $string [, int $limit])           ...

  10. 理解innodb buffer pool

    今天组里有个同事说可以查看innodb buffer pool每个表和索引占的大小,为此我搜了下,还真有方法,记录下. innodb buffer pool有几个目的: 缓存数据--众所周知,这个占了 ...