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】获取电磁笔的压感的更多相关文章

  1. CDR 2017压感笔和压感设备该怎么设置使用?

    您可以通过CorelDRAW 2017 中的以下工具来运用压感笔.笔或其他设备的压力:艺术笔(表达模式).橡皮擦.涂抹.转动.吸引.排斥.粗糙和弄脏.此外,您还可以通过艺术笔(表达模式)工具.橡皮擦. ...

  2. WPF 获取程序路径的一些方法,根据程序路径获取程序集信息

    一.WPF 获取程序路径的一些方法方式一 应用程序域 //获取基目录即当前工作目录 string str_1 = System.AppDomain.CurrentDomain.BaseDirector ...

  3. WPFの获取任意元素的位置

    如果布局在Grid中: 方法一: //_stackPanel为子元素,_grid为父元素 Point point = _stackPanel.TranslatePoint(new Point(0, 0 ...

  4. c# WPF 获取网络图片,验证码

    c# WPF 获取网络图片,验证码 public static BitmapImage getValidCodeBitmap() { string url = "http://my.baaa ...

  5. WPF 获取应用的所有窗口

    原文:WPF 获取应用的所有窗口 本文告诉大家如何获取应用内的所有窗口,无论这些窗口有没显示 在 WPF 可以通过 Application.Current.Windows 列举应用的所有窗口 fore ...

  6. WPF 获取 ListView DataTemplate 中控件值

    原文:WPF 获取 ListView DataTemplate 中控件值 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei19 ...

  7. WPF 获取鼠标屏幕位置、窗口位置、控件位置

    原文:WPF 获取鼠标屏幕位置.窗口位置.控件位置 public struct POINT { public int X; public int Y; public POINT(int x, int ...

  8. WPF获取外部EXE图标最简单的方法

    原文:WPF获取外部EXE图标最简单的方法 首先在工程添加对System.Drawing的引用 创建以下方法: public static ImageSource GetIcon(string fil ...

  9. [WPF]获取鼠标指针下的元素

    原文:[WPF]获取鼠标指针下的元素   [WPF]获取鼠标指针下的元素 周银辉 以前写过一些GetElementUnderMouse之类的函数,要用到坐标换算而显得有些麻烦(特别是当元素有XXXTr ...

随机推荐

  1. iOS开发之UICollectionViewController

    1.概述 UICollectionView控件主要是用来做九宫格的,类似于android中的GridView控件.其用法与UITableView一样,首先要使控制器遵守数据源协议,再将控制器设置为UI ...

  2. 解决虚拟机vmware安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题

    虚拟机使用的是VMware Workstation,并且首次在虚拟机体验64 位系统.在新建好虚拟机,运行时候就出现了VMware Workstation 的提醒:此主机支持 Intel VT-x,但 ...

  3. xml学习_上篇

    xml简介: XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. xml小示例: /************************ ...

  4. POPTEST老李分享修改dns ip的vbs代码

    POPTEST老李分享修改dns ip的vbs代码   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

  5. Android Studio查找功能(搜索功能)及快捷键

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1.在当前窗口查找文本[Ctrl+F] F3                  向下查找关键字出现位置 Shift+F3        向上一个关 ...

  6. 1.Maven的安装及配置

    1 Maven 介绍 Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”.本书将介绍Maven这一跨平台的项目管理工具.作为Apache组织中的一个颇为成功的开源项目,Maven ...

  7. Entity Framework快速入门--IQueryable与IEnumberable的区别

    IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代.也就是说:实现了此接口的object,就可以直接使用foreach遍历此object: IQueryable 接口 ...

  8. JS高级学习路线——面向对象进阶

    构造函数进阶 使用构造函数创建对象 用于创建对象 其除了是一个函数之外,我们又称之为构造对象的函数 - 简称构造函数 function Product(name,description){ //属性 ...

  9. 源码阅读之mongoengine(0)

    最近工作上用到了mongodb,之前只是草草了解了一下.对于NoSQL的了解也不是太多.所以想趁机多学习一下. 工作的项目直接用了pymongo来操作直接操作mongodb.对于用惯了Djongo O ...

  10. Android可以换行的布局

    本文讨论的是下图的这种数据展示方式 通过本文可以学到的内容 ===View绘制的工作流程measure和Layout,即测量和布局: ===动态创建和添加子View,以及设置点击事件的一种思路 1.主 ...