博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
阅读量:5891 次
发布时间:2019-06-19

本文共 1151 字,大约阅读时间需要 3 分钟。

原文:

在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件。

例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开。
在这个过程中,控件1只会触发MouseDown事件,而控件2则只会触发MouseUp事件,鼠标不在控件上他们就收不到对应的鼠标事件。
同样的如果某个控件注册了MouseMove事件,当鼠标移动到控件外之后,控件将不会接收到MouseMove事件。
但是在很多情况下我们需要在鼠标移动到控件外之后还能接收鼠标事件。例如按住鼠标拖动,当鼠标到了控件外,拖动操作依然可以继续。
这些情况需要控件强制捕获鼠标,这就要用到UIElment 的CaptureMouse 函数和ReleaseMouseCapture 函数。
CaptureMouse 函数的作用是尝试将鼠标强制捕获到控件,ReleaseMouseCapture 函数的作用是当控件具有鼠标捕获的话,则释放该捕获。
下面举个例子,例如我们需要在一张图片上通过鼠标拖动画一个矩形框,操作步骤分为:
1. 点击鼠标左键,确定矩形的一个顶点P;
2. 按住鼠标左键并拖动鼠标,将鼠标位置作为矩形中顶点P所属的对角线的另外一个顶点,画矩形;
3. 放开鼠标左键,完成矩形绘制。
但是当鼠标移动到图片边缘的时候,图片接收不到鼠标MouseMove和MouseUP事件,绘制过程就无法正常完成了。

为了解决这个问题,我们需要在MouseLeftButtonDown 事件的相应函数中加上如下代码

((UIElement)e.Source).CaptureMouse();
在MouseUp 事件的相应函数中加入
((UIElement)e.Source).ReleaseMouseCapture();
这样,即使鼠标在图片外,我们也能继续执行捕获的鼠标事件。
为了让矩形不画到图片外,我们可以对矩形的边框位置加上限制,矩形的两个顶点必须限制:
    Point p = e.GetPosition(this.imageControl);
    p.X = Math.Max(0, p.X);
    p.Y = Math.Max(0, p.Y);
    p.X = Math.Min(this.imageControl.Width, p.X);
    p.Y = Math.Min(this.imageControl.Height, p.Y);
在使用了CaptureMouse 函数将鼠标强制捕获到控件后,一定不要忘记在完成操作后使用ReleaseMouseCapture 函数释放捕获,

否则在其他控件上进行鼠标操作依然会触发捕获鼠标的控件的鼠标事件,而非原本鼠标点击的控件的鼠标事件响应函数。

转载地址:http://vggix.baihongyu.com/

你可能感兴趣的文章
DirectshowLib摄像头拍照的”未找到可用于建立连接的介质筛选器组合“ 解决办法...
查看>>
wcf-1
查看>>
三种简单排序
查看>>
[Java]读取文件方法大全
查看>>
【NopCommerce源码架构学习-二】单例模式实现代码分析
查看>>
动态规划大合集II
查看>>
MySQL忘记密码后重置密码(Mac )
查看>>
web.xml中的url-pattern映射规则
查看>>
图像的下采样Subsampling 与 上采样 Upsampling
查看>>
SQL 数据类型
查看>>
支付宝接口调用,支付操作
查看>>
如何在ashx页面获取Session值 (仅供个人参考)
查看>>
cookie与session
查看>>
Linux经常用到的命令以及快捷键
查看>>
计算题:挣值、预测、沟通、盈亏平衡点、
查看>>
js 实现 aop
查看>>
Dalvik VM和JVM的比较以及Android新的虚拟机ART
查看>>
【CSU 1803】2016
查看>>
SQLServer 批量备份与还原
查看>>
51Nod 1010 只包含因子2 3 5的数 Label:None
查看>>