【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 ...
随机推荐
- Oracle数据块损坏的恢复实例
测试环境:11.2.0.4 1.构建数据块损坏的测试环境 2.有备份:常规恢复坏块 3.无备份:跳过坏块 1.构建数据块损坏的测试环境 1.1 创建测试表 --Create Table t_test ...
- Linux之wc命令
wc - print newline, word, and byte counts for each file 为文件打印行数,字符数,字节数 参数: -l 仅列出行 -w 仅列出多少字(英文单字 ...
- python安装图文教程---超详细。。。不过是转的,但有改动
如果你已安装好python,想安装第三方模块,方法详见如下地址: python安装第三方模块教程----marsggbo 1.想要安装Python,首先当然是去Python的官方网站(www.pyth ...
- MVC学习笔记1-MVC家族间的区别
ASP.NET下的MVC从原始的1.0走到2.0,再到3.0,现在走到4.0,也许明年5.0就问世了,先不管那些,那说说这些MVC在ASP.NET是如何变化发展的.对于.net编程人员来说可能会很熟悉 ...
- Java排序算法之直接选择排序
Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...
- 模块化规范Common.js,AMD,CMD
随着网站规模的不断扩大,嵌入网页中的javascript代码越来越大,开发过程中存在大量问题,如:协同开发,代码复用,大量文件引入,命名冲突,文件依赖. 模块化编程称为迫切的需求. 所谓的模块,就是实 ...
- Nagios安装部署
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; line-height: 150%; fon ...
- 【转】flash air中读取本地文件的三种方法
actionscript中读取本地文件操作有两种代码如下 1.使用File和FileStream两个类,FileStream负责读取数据的所以操作:(同步操作) var stream:FileStre ...
- Android开发艺术2之Activity的启动模式
Activity是Android的四大组件之一,他的重要性毋庸置疑,对于这么重要的一个组件,我们首先要知道这些都是由系统进行管理和回调的,要理解Activity的启动模式,我们首先来了解一下Andro ...
- LoonAndroid自动检测输入框 --- Author: rose && lvyerose@163.com
LoonAndroid框架,同时给我们提供了一套自动检测输入规则的工具,用起来很是方便,下面介绍一下这个东东的使用方法(注意,该说明是基于项目已经集成了LoonAndroid框架而言,如果您未集成该框 ...