Loading... 今天的这篇文章主要是记录在实现MyKTV项目过程中的扩展功能,手写板。 > 下方内容由**黄晓宇**老师提供 ## 准备工作 首先创建一个Windows窗体应用程序,项目名称和解决方案名称自定义即可。 手写板功能需要添加**Microsoft.Ink**的引用,同学们的电脑上可能没有这个dll文件,可以点击下方链接,下载dll文件即可,压缩包中分别提供了32位和64位的应用程序扩展,同学们根据需求自行引用对应的dll文件即可。 [下载Microsoft.lnk.dll](https://www.jbea.cn/usr/uploads/2021/12/1972802342.rar) ## 添加引用 下载好上面的程序扩展dlll文件之后,选择项目下面的“引用” - “添加引用” - “浏览” - 选择解压目录下的dll文件 - “确定” ![添加引用](https://www.jbea.cn/usr/uploads/2021/12/1716253091.png) ![浏览](https://www.jbea.cn/usr/uploads/2021/12/4265200591.png) ![选择对应的dll文件](https://www.jbea.cn/usr/uploads/2021/12/3158331501.png) 检查Microsoft.Ink是否成功被添加 ![引用添加成功](https://www.jbea.cn/usr/uploads/2021/12/3611502180.png) ## 绘制窗体 在窗体设计页面拖拽如下控件,Label控件、TextBox控件、PictureBox控件(用于保留书写墨迹),窗体设计如下(你们可以设计的美观一点): ![窗体设计](https://www.jbea.cn/usr/uploads/2021/12/4283720897.png) ## 编写代码 窗体绘制完毕之后,就要开始写代码了,重点信息都在注释里,你们大伙慢慢消化一下: ```cs using System; using System.Drawing; using System.Windows.Forms; using Microsoft.Ink; namespace write { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } //创建获取墨迹的对象 InkCollector iCollector = null; //创建获取各种识别器的对象 RecognizerContext rContext = null; //临时字体保存 string tempText = ""; //当累加值达到5000的时候,清除画板,书写下一个字 int ms = 0; /// <summary> /// 窗体加载事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmMain_Load(object sender, EventArgs e) { //调用初始化对象的方法 Init(); } /// <summary> /// 初始化手写板 /// </summary> private void Init() { //初始化墨迹捕获对象,并获取捕获范围 iCollector = new InkCollector(picWriter.Handle); //生成事件 iCollector.Stroke += new InkCollectorStrokeEventHandler(ICollector_Stroke); iCollector.Enabled = true; ink_Language(); //设定手写板识别语言 //识别在控件上留下的笔迹 rContext.Strokes = iCollector.Ink.Strokes; //设置笔记颜色 iCollector.DefaultDrawingAttributes.Color = Color.Black; } /// <summary> /// 获取需要识别的语言 /// </summary> void ink_Language() { //语言识别 Recognizers recos = new Recognizers(); //使用默认的识别器 Recognizer chineseRecoe = recos.GetDefaultRecognizer(); //初始化一个新的识别器 rContext = chineseRecoe.CreateRecognizerContext(); } /// <summary> /// 生成笔迹事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ICollector_Stroke(object sender, InkCollectorStrokeEventArgs e) { try { ms = 0; //停止背景识别的方法 rContext.StopBackgroundRecognition(); //添加识别墨迹 rContext.Strokes.Add(e.Stroke); rContext.BackgroundRecognizeWithAlternates(0); //获取字符绑定 到控件 tempText = iCollector.Ink.Strokes.ToString(); lblTempView.Text = tempText; //将临时识别出来的字,显示出来 } catch (Exception ex) { MessageBox.Show("手写板识别错误,错误信息:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// <summary> /// 开启定时器,如果用户5秒未操作,则清除画板 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tIsNext_Tick(object sender, EventArgs e) { ms += 1000; if (ms == 2000) //根据操作习惯,自行调整事件间隔 { txtContext.Text += tempText; tempText = ""; lblTempView.Text = ""; txtContext.Focus(); ClearWritePanel(); ms = 0; } } /// <summary> /// 清空画板 /// </summary> private void ClearWritePanel() { if (iCollector != null && !iCollector.CollectingInk) { Strokes strokesToDelete = iCollector.Ink.Strokes; rContext.StopBackgroundRecognition(); iCollector.Ink.DeleteStrokes(strokesToDelete); rContext.Strokes = iCollector.Ink.Strokes; iCollector.Ink.DeleteStrokes(); picWriter.Refresh(); } } } } ``` 运行效果: ![运行效果](https://www.jbea.cn/usr/uploads/2021/12/2650833770.gif) 源代码下载: <div class="hideContent">此处内容需要评论回复后(审核通过)方可阅读。</div> --- 有任何问题,请在评论区告诉我哦~ 最后修改:2021 年 12 月 30 日 © 允许规范转载 赞 14 都滑到这里了,不点赞再走!?
16 条评论
这个好高级啊
这一行提示:
System.InvalidOperationException:“当前设置或配置无法使用请求的识别器。”
什么情况呢?
这一行提示:
System.InvalidOperationException:“当前设置或配置无法使用请求的识别器。”
什么情况呢?
下载一个看看先,
下载一个看看先,
。。。
是
为什么这个手写输入的李字显示是错误的
...
...
...
φ( ̄∇ ̄o)
那个picWriter是哪一个控件的名称
是下面的白色书写面板,可以下载源代码看看