【WPF】获取电磁笔的压感
WPF 不仅支持触控,也支持笔的输入,比如现在比较高大上的电磁笔。便宜的板子一般不配备电磁笔,而是配电容笔,虽然也号称XXX级压感,但是效果自然不可与电磁笔相比。
UIElement 类规范了UI元素的基本轮廓,在该类公开的事件中,大凡以 Stylus 开头的事件,都与书写笔有关。这里大伙伴要注意一点,当笔尖按下屏幕时会发生 StylusDown 事件,但是,此时我们还不能够得到笔的压力值。
紧随其后就会发生 StylusMove 事件。笔按下后就会马上引上这个事件,而且,只要笔在屏幕上移动就会不断引发这个事件,前提是你在移动笔尖时不能离开屏幕。如果笔尖提起,会发生 StylusUp 事件;笔尖提起后,处于悬空状态,只要笔还在感应范围内,移动笔尖会发生 StylusInAirMove 事件。注意区别,笔尖按下时移动发生的是 StylusMove 事件,而悬空后移动会发生 StylusInAirMove 事件。
笔输入的数据由 StylusPoint 结构来封装,其中,X和Y相信你也猜到,就是笔尖的坐标,这点与鼠标事件相似。不过,笔输入的数据还带有一个 PressureFactor 字段,对,重点就是它了,它表示笔的压力。
不管你的笔是 256 级压感,还是 1024 级 2048 级压感,PressureFactor 字段值始终在 0 和 1 之间,它是个浮点数值,数字越小,表示压力越小;反之表示压力越大。
好了,经过老周上面一堆废话,估计你也已经知道这活怎么干了。下面,还是老规矩,学习不干活是不行的,所以,我们得动手,才能弄懂。
首先,在窗口上放一个矩形。
<Grid Background="Transparent">
<Rectangle Fill="Red" Name="rect" />
</Grid>
把这个矩形的填充颜色设为红色,待会儿咱们感应电磁笔的压力,动态调整矩形的透明度。压力越大,矩形越红,比那些网红还要红。
接着,处理相关事件。
<Rectangle Fill="Red" Name="rect"
StylusMove="OnStyluesMove"/>
然后编写处理代码。
private void OnStyluesMove(object sender, StylusEventArgs e)
{
var pts = e.GetStylusPoints(null);
foreach (var p in pts)
{
rect.Opacity = p.PressureFactor;
}
}
因为笔尖在屏幕上移动时,可能一次会产生N个坐标,所以,GetStylusPoints方法返回一个点的集合,这个方法在调用时,需要传递一个元素引用,用来作为参照对象,即,所获取的坐标是相对于这个对象。此处用 null 表示获取到的点是相对于根,如窗口。
由于笔尖的一次移动可能产生多个点,这里我顺便 foreach 了一下,其实,眼睛看到的最后一轮设置的值。因而你完全可以去掉这个 foreach ,在点集合中,只取出一个点出来就行了(最后一个点)。我姑且保留 foreach ,大伙儿可以下载源码后,自行玩耍。
巧合的是,Opacity 属性的值范围是 0 到 1,PressureFactor 的值范围也是 0 到 1,所以,直接赋值就完事了,不用转化计算。
最后运行程序,然后拿电磁笔狠狠地扎几下窗口,你就能看到压感的变化了。效果请参考下面的高清无码无水印动图。

好,今天就聊到这里,see you。
【WPF】获取电磁笔的压感的更多相关文章
- CDR 2017压感笔和压感设备该怎么设置使用?
您可以通过CorelDRAW 2017 中的以下工具来运用压感笔.笔或其他设备的压力:艺术笔(表达模式).橡皮擦.涂抹.转动.吸引.排斥.粗糙和弄脏.此外,您还可以通过艺术笔(表达模式)工具.橡皮擦. ...
- WPF 获取程序路径的一些方法,根据程序路径获取程序集信息
一.WPF 获取程序路径的一些方法方式一 应用程序域 //获取基目录即当前工作目录 string str_1 = System.AppDomain.CurrentDomain.BaseDirector ...
- WPFの获取任意元素的位置
如果布局在Grid中: 方法一: //_stackPanel为子元素,_grid为父元素 Point point = _stackPanel.TranslatePoint(new Point(0, 0 ...
- c# WPF 获取网络图片,验证码
c# WPF 获取网络图片,验证码 public static BitmapImage getValidCodeBitmap() { string url = "http://my.baaa ...
- WPF 获取应用的所有窗口
原文:WPF 获取应用的所有窗口 本文告诉大家如何获取应用内的所有窗口,无论这些窗口有没显示 在 WPF 可以通过 Application.Current.Windows 列举应用的所有窗口 fore ...
- WPF 获取 ListView DataTemplate 中控件值
原文:WPF 获取 ListView DataTemplate 中控件值 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei19 ...
- WPF 获取鼠标屏幕位置、窗口位置、控件位置
原文:WPF 获取鼠标屏幕位置.窗口位置.控件位置 public struct POINT { public int X; public int Y; public POINT(int x, int ...
- WPF获取外部EXE图标最简单的方法
原文:WPF获取外部EXE图标最简单的方法 首先在工程添加对System.Drawing的引用 创建以下方法: public static ImageSource GetIcon(string fil ...
- [WPF]获取鼠标指针下的元素
原文:[WPF]获取鼠标指针下的元素 [WPF]获取鼠标指针下的元素 周银辉 以前写过一些GetElementUnderMouse之类的函数,要用到坐标换算而显得有些麻烦(特别是当元素有XXXTr ...
随机推荐
- iOS 组件化
iOS 组件化介绍 随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间 ...
- Android 增加(键盘)按键
以添加 camera按键为例(红色是需要添加的) 一.kernel键值定义 (1)键扫描码 ScanCode是由linux的Input驱动框架定义的整数类型,可参考input.h头文件,即geteve ...
- MySQL1236错误的恢复
从库出现问题 mysql> show slave status\G; *************************** . row *************************** ...
- 深入hibernate的三种状态
学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别 ...
- 记录一次坑爹的VM连接主机的路程
因为之前电脑配置过虚拟机连接主机的过程,所以没有太在意,换电脑了之后配了两天结果没有配置成功; 首先配置静态ip: 1,编辑第一个文件/etc/sysconfig/network-scripts/if ...
- 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本
老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...
- git初学笔记1
之前对于软件的版本管理全靠粘贴辅助,觉得很low,而且也不是很方便.听前辈说git很好用,然后就学了一下. 今天主要学了些基本的操作命令,总结如下: 1. git最基本的操作 2. commit提交 ...
- Math.pow用法及实现探究
pow函数在java.lang.Math类中,是求次方的函数,定义为: public static double pow(double a, double b): 即求a的b次方,例如: public ...
- H5学习的第三周
上周,我们结束了京东站的制作,本周我们开始了手机站和响应式网站的学习,并仿制了一个手机端界面和一个响应式界面,在完成这两个网站的过程中我遇到了许多问题,也了解了它们的解决方法,接下来我讲详细介绍本周我 ...
- python select epoll poll的解析
select.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组(在linux中一切事物皆文件 ...