WinForm中MouseEnter和MouseLeave混乱的问题
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混乱的问题的更多相关文章
- WPF和Winform中picturebox图片局部放大
原文:WPF和Winform中picturebox图片局部放大 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/artic ...
- mouseenter以及mouseleave兼容性
在IE的全系列中都实现了mouseenter和mouseleave事件,但是在早期的w3c浏览器中却没有实现这两个事件.有时候,我们需要使用 mouseenter事件来防止子元素的冒泡,这就涉及到事件 ...
- ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave由于鼠标移动速度过快导致问题解决办法
记录两个项目开发中遇到的问题,一个是ECharts外部调用保存为图片操作,一个是workflow工作流连接曲线onmouseenter和onmouseleave事件由于鼠标移动过快触发问题. 一.外部 ...
- mouseover和mouseout、mouseenter和mouseleave
又一个傻傻分不清楚的东东~ 现实真是一个问题天天有的世界~本以为我对js中的事件还是比较了解的,对于早就接触的mouse事件,更是觉得得心应手了~但是现实却给了我一记重拳! 我自身工作中遇到的犯二的故 ...
- 第二十七课:滚轮事件,mouseenter与mouseleave事件的修复
滚轮事件 jQuery核心库没有对mousewheel事件的差异性进行处理,但作为一个常用的事件,本文讲解一下. mousewheel事件只有火狐浏览器不支持.mousewheel用于取得滚动距离的属 ...
- mouseover,mouseout,mouseenter,mouseleave的区别
相信做前端开发的都听说过“冒泡型事件”吧,<JavaScript高级程序设计>第九章有详细的讲述,但是,在学习的时候一知半解,也没详细去理解,导致最近在工作中碰到了问题:有许多 li 标签 ...
- mouseover,mouseout与mouseenter,mouseleave
针对单个元素,使用感一样. 差异提现在有子元素的情况下: mouseover和mouseout在父元素和其子元素都可以触发,当鼠标穿过一个元素时,触发次数得依子元素数量而言. mouseenter和m ...
- mouseover、mouseout和mouseenter、mouseleave
这里直接把<Javascript 高级程序设计(第三版)>中的解释贴出来: mouseover:在鼠标指针位于一个元素外部,然后用户将其首次移入另一个元素边界之内时触发.不能通过键盘触发这 ...
- mouseout和mouseover、mouseenter和mouseleave
在前端开发中经常会碰到当鼠标放到一个元素上时会弹出你一个元素,鼠标离开那个弹出元素后隐藏.这类效果一般要用到一些鼠标事件,一类是mouseout和mouseover,另一类是mouseen ...
随机推荐
- Java绘图
paintComponent(Graphics g)方法: 1.不调用super.paintComponent(g)的话,rePaint()的时候就会把你写的paintComponent中的内容绘制上 ...
- 关于mybatis的理解
http://blog.csdn.net/jiuqiyuliang/article/details/45132493 写的不错很好!
- ubuntu command
uninstall software: sudo apt-get purge openjdk*
- C#中使用正则表达式验证电话号码、手机号、身份证号、数字和邮编
验证电话号码的主要代码如下: public bool IsTelephone(string str_telephone) { return System.Text.RegularExpressio ...
- hsql数据库使用详解(入门)及快速使用
一.简介: hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,不凡考虑一下使用它,相对其 他数据库来说,其体积小,才563kb.仅一个hsq ...
- Samsung S4卡屏卡在开机画面的不拆机恢复照片一例
大家好!欢迎再次来到我Dr.wonder的世界, 今天我给你们带来Samsung S4 I9508 卡屏开在开机画面的恢复!非常de经典. 首先看图 他开机一直卡在这里, 然后 ,我们使用专业仪器,在 ...
- 161223、mysql锁的两个例子
版本:mysql5.5.52 存储引擎:InnoDB 隔离级别:READ-COMMITTED 示例一: 事务1:左图 事务2:右图 1. 事务2中属于快照读,基于多版本的并发控制协议--MV ...
- Mysql 5.7 Linux安装详细步骤
版权声明:本文为博主原创文章,未经博主允许不得转载. 1.下载安装包 http://dev.mysql.com/downloads/mysql/#downloads 推荐下载通用安装方法的TAR包(h ...
- 浅析Java.lang.Process类
一.概述 Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...
- php正则表达式 常用记录
一正则汉字匹配数字id 汉字 $str = '<a href="http://music.baidu.com/song/121353608" target="_bl ...