利用微软的Ink,实现手写输入。
不用自带的InkCanvas,重写的绘制的效果。
根据速度调节线条粗细了。其实不算是线条吧,PathGeometry对象。
然后再向Ink引擎传入笔画数据,其实就是点。上两张图
字写的不好看。来看看代码吧
主要代码:
Imports Microsoft.Ink
'Imports System.Windows.Ink
'C:\Program Files (x86)\Common Files\Microsoft Shared\Ink
'添加对 WPF 墨迹分析程序集、IAWinFX.dll、IACore.dll 和 IALoader.dll(这些内容可以在 \Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 中找到)的引用。
Structure PointInfo
Public pt As Point REM 点的位置
Public dir As Vector REM 与上一个点之间的方向
Public len As Single REM 上一个点到这个点的距离
Public perpendicular As Vector REM 与上一个点之间的方向的垂直
Public Function ToDrawingPoint() As System.Drawing.Point
Return New System.Drawing.Point(pt.X, pt.Y)
End Function
End Structure
Class MainWindow
Private bmp As RenderTargetBitmap REM 渲染到的图片
Private dv As New DrawingVisual() REM 绘制到图片的visual
Private geo As PathGeometry REM 一笔 存的所有的path
Private geos As New List(Of PathGeometry) REM 所有笔划
Private ptStart As Point REM 起始点
Private ptEnd As Point REM 终点
Private ptinfos As New List(Of PointInfo) REM 点的信息
REM 求垂直与输入向量的向量,顺时针,应该还有更好的写法吧
Public Function Perpendicular(v As Vector) As Vector
Dim result As Vector
If v.Y = 0 And v.X = 1 Then
Return New Vector(0, -1)
ElseIf v.Y = 0 And v.X = -1
Return New Vector(0, 1)
Else
If v.Y > 0 Then
result.X = Math.Sqrt(v.Y * v.Y / (v.X * v.X + v.Y * v.Y))
Else
result.X = -Math.Sqrt(v.Y * v.Y / (v.X * v.X + v.Y * v.