WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
在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 函数释放捕获,
否则在其他控件上进行鼠标操作依然会触发捕获鼠标的控件的鼠标事件,而非原本鼠标点击的控件的鼠标事件响应函数。
WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件的更多相关文章
- WinForm 鼠标进入移开窗体事件,因子控件导致的误触发
/// <summary> /// 重写OnControlAdded方法,为每个子控件添加MouseLeave事件 /// </summary> /// <param n ...
- WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感 ...
- 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨
原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...
- delphi中响应鼠标进入或离开控件的方法
Delphi没有MouseEnter与MouseLeave的事件,网上说可以响应CM_MOUSEENTER和CM_MOUSELEAVE消息来实现.这两个消息是VCL自己定义的消息,看了Delphi的C ...
- 关于C#界面开发winform与SharpGL结合鼠标只在OpenGLControl绘图区域显示坐标移动消息响应(鼠标单独在某个控件上的消息响应)
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11773260.html 因为很多时候我们开发画图之类的工具时,鼠标移动之类的,都只想在绘图区域 ...
- 《Programming WPF》翻译 第5章 7.控件模板
原文:<Programming WPF>翻译 第5章 7.控件模板 如果仔细的看我们当前的TTT游戏,会发现Button对象并没有完全为我们工作.哪些TTT面板有内圆角? 图5-14 这里 ...
- 【WPF学习】第六十章 创建控件模板
经过数十天的忙碌,今天终于有时间写博客. 前面一章通过介绍有关模板工作方式相关的内容,同时介绍了FrameWorkElement下所有控件的模板.接下来将介绍如何构建一个简单的自定义按钮,并在该过程中 ...
- WPF中嵌入WinForm中的webbrowser控件
原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能 ...
- WPF自定义控件(二)の重写原生控件样式模板
话外篇: 要写一个圆形控件,用Clip,重写模板,去除样式引用圆形图片可以有这三种方式. 开发过程中,我们有时候用WPF原生的控件就能实现自己的需求,但是样式.风格并不能满足我们的需求,那么我们该怎么 ...
随机推荐
- 2.SpringMVC注解开发
1.创建SpringMVC项目 配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-a ...
- 关于c++的一篇随笔
众所周知c++是一门极其深奥的学科,正因为其深奥之处,才会让人们觉得学习起来特别难.当然,我想说我自己也不例外,想起当初就像一场噩梦一样,直到今日还历历在目.尽管如此,c++还是一门相当有魅力的课程, ...
- Spark 介绍
MapReduce给用户提供了简单的编程接口,用户只需要按照接口编写串行版本的代码,Hadoop框架会自动把程序运行到很多机器组成的集群上,并能处理某些机器在运行过程中出现故障的情况.然而,在MapR ...
- Spring+Redis集成+关系型数据库持久化
本篇文章主要介绍了"Spring+Redis集成+关系型数据库持久化",主要涉及到Spring+Redis集成+关系型数据库持久化方面的内容,对于Spring+Redis集成+关系 ...
- LSTM和GRU
LSTM和GRU LSTM 忽略偏置: \[\begin{align} i_t&=\sigma(x_t\cdot W_i+h_{t-1}\cdot U_i)\\ f_t&=\sigma ...
- 110道python面试笔试题汇总,你能答对几道?
数据分析系列教程插播一篇面试题教程,最近公众号新来了不少朋友,这几天不少粉丝留言说问我有没有python面试题,其实之前分享过一些面试题,今天统一再给大家分享一遍,也希望能帮助此时仍在找工作的同学,尽 ...
- The SDK 'Microsoft.NET.Sdk' specified could not be found.
有一台电脑用 VS Code 开发 .NET Core 项目时,每次打开文件夹都有一个错误(标题),定位在 C# 插件,鼠标放在代码上没有智能提醒,输入代码时没有补全提示,重装 VS Code 和所有 ...
- jQuery实现遮罩层
1.1 背景半透明遮罩层样式 需要一个黑色(当然也可以其他)背景,且须设置为绝对定位,以下是项目中用到的css样式: /* 半透明的遮罩层 */ #overlay { background: #000 ...
- shell 中的单行注释和多行注释
1. 单行注释 众所周知,# 比如想要注释:echo “ni” # echo "ni" 2. 多行注释: 法一: : << ! 语句1 语句2 语句3 语句4 ! 例 ...
- localhost无法访问的问题
localhost无法访问,提示访问超时 ping localhost 和 ping 127.0.0.1 都提示一般故障,如下图 问题原因:windows防火墙故障 解决办法:关闭windows防火墙 ...