尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

WinForm应用实战开发指南 - 应用程序如何实现手写签名?

WinForm应用实战开发指南 - 应用程序如何实现手写签名? 由于项目的需要需要在项目的WinForm系统的一个模块中集成手写签名的功能一开始对这块不是很了解只是了解他能够替代鼠标进行签名。既然是签名一般就是需要记录手稿图片作为一个记录核实的凭证因为有效的签名是很难模拟的。市场上也存在很多类型的电子签名笔一时间还真不知道那种适合。WinForm应用的界面开发有个很好用的界面控件推荐——​​​​​​​​DevExpress WinForm​s拥有180组件和UI库能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress新旧版本帮助文档下载可进QQ qun获取1697253161. 电子手写签名介绍电子手写签名其实就是模拟真实的笔进行签名的过程我这里主要是介绍使用外部设备来记录手稿图片的需求这样其实就是类似于把我们真实在纸张上的签名内容放到了电脑记录面板上进行操作了而这个操作模拟其实就是利用了类似鼠标功能的接触笔来实现的。有些笔是在纸上或者电脑屏幕上进行模拟签名通过一个接收器方式接受笔的接触信号一般要先设定纸张或者屏幕的范围然后进行签名书写。由于签名笔淘宝上也有很多开始淘到的就是类似这种不过效果不理想好像总是定位不准而且和鼠标发生严重冲突基本上操作不了商家客服说很少有这种现象发生但是却发生在我身上于是只有退货。然后淘到的是一款汉王手写板笔开始用的还可以其实就是代替了鼠标进行操作试过可以后就搁置起来。一直用鼠标模拟签名进行开发写该篇随笔的时候本来想用来展示下效果可惜又用不了不知道什么原因。做签名功能开发的时候其实我是不关注手写笔功能的因为我想其实如果鼠标能操作就可以手写笔其实也就应该可以操作。因此只需要在输入的地方记录鼠标操作的痕迹类似手写签名的效果即可大概如下所示。2. 手写签名的实现从上图可以看到只需要提供一个类似绘图的面板即可记录鼠标的轨迹也就是功能有点类似Windows自带的白板或者绘图板软件即可。其实要模拟鼠标签名的效果只需要利用功能强大的GraphicsPath对象就差不多了剩下的就是记录点和绘制点设置绘图笔的宽度和颜色等方面。下面我们看看具体的实现代码吧。首先要申明几个必要的对象来承载相关的信息。//记录直线或者曲线的对象 private System.Drawing.Drawing2D.GraphicsPath mousePath new System.Drawing.Drawing2D.GraphicsPath(); //画笔透明度 private int myAlpha 100; //画笔颜色对象 private Color myUserColor new Color(); //画笔宽度 private int myPenWidth 3; //签名的图片对象 public Bitmap SavedBitmap;从上图效果图上我们看到我们在其中放置了一个绘图面板其实就是一个PictureBox对象而已我们只需要在PictureBox对象记录鼠标的移动、鼠标按下以及对象刷新操作事件即可实现模拟签名的效果了如下代码所示。private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (e.Button System.Windows.Forms.MouseButtons.Left) { try { mousePath.AddLine(e.X, e.Y, e.X, e.Y); } catch (Exception ex) { MessageBox.Show(ex.Message); } } pictureBox1.Invalidate(); } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button System.Windows.Forms.MouseButtons.Left) { mousePath.StartFigure(); } } private void pictureBox1_Paint(object sender, PaintEventArgs e) { try { myUserColor System.Drawing.Color.Blue; myAlpha 255; Pen CurrentPen new Pen(Color.FromArgb(myAlpha, myUserColor), myPenWidth); e.Graphics.DrawPath(CurrentPen, mousePath); } catch { } }保存及清空操作其实很简单清空的时候记得把绘图面板清空并重置路径对象即可。保存也是记录PictureBox对象的大小宽度把图片存储到图片对象里面供控件使用。具体实现如下所示。private void btnClear_Click(object sender, EventArgs e) { pictureBox1.CreateGraphics().Clear(Color.White); mousePath.Reset(); } private void btnSave_Click(object sender, EventArgs e) { SavedBitmap new Bitmap(pictureBox1.Width, pictureBox1.Height); pictureBox1.DrawToBitmap(SavedBitmap, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height)); this.DialogResult System.Windows.Forms.DialogResult.OK; }上面实现还不能完成一个最终的签名效果有时候我们需要把这些图片放到数据库里面如果是把上面的操作的图片记录下来发现很大一般我们签名的效果显示不会很大一方面只需要辨认其笔迹即可另外一方面也不会过于增大数据库的存储空间。那么我们就需要对图片大小进行一定的处理了。其实可能在详细信息里面我们就这样记录显示即可。那么就一定要裁剪图片的大小。以上的医生签名我们触发的操作就是弹出一个签名窗体在其中绘制签名确认后返回并把图片进行显示在详细信息窗体里面。private void btnDoctorSign_Click(object sender, EventArgs e) { FrmSignicture dlg new FrmSignicture(); if (dlg.ShowDialog() System.Windows.Forms.DialogResult.OK) { this.picDoctor.Image dlg.SavedBitmap; } }为了安装最终显示的PictureBox的大小保存图片我们需要裁减裁减就是重新根据图片大小进行保存Bitmap对象这种可以从全屏最初的几M缩小到十几K方便存储。至于图片对象存储到数据库这个由于利用了我Winform开发框架里面的数据库基础对象基本上不需要特别对待及处理只需要把图片字段的Byte数组获得即可了。这里就不在赘述Winform开发框架的功能及相关的基类处理了。public Bitmap SaveImage(PictureBox pictureBox1) { Bitmap SavedBitmap new Bitmap(pictureBox1.Width, pictureBox1.Height); pictureBox1.DrawToBitmap(SavedBitmap, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height)); return SavedBitmap; }最后有时候签名还需要在列表里面显示这样方便对一些关键信息进行查看核对。如下图所示那么对于列表中显示图片我们在DevExpress界面的分页控件中应该如何处理呢这估计也是​​​​​​​DevExpress开发中很多常见问题之一其实也很简单就是在DataSourceChanged 变化的事件中改变单元格的对象属性即可。this.winGridViewPager1.OnRefresh new EventHandler(winGridViewPager1_OnRefresh); this.winGridViewPager1.ShowLineNumber true; this.winGridViewPager1.gridView1.Appearance.Row.TextOptions.HAlignment DevExpress.Utils.HorzAlignment.Center; this.winGridViewPager1.gridView1.Appearance.HeaderPanel.TextOptions.HAlignment DevExpress.Utils.HorzAlignment.Center; this.winGridViewPager1.AppendedMenu this.contextMenuStrip1; this.winGridViewPager1.gridView1.DataSourceChanged new EventHandler(gridView1_DataSourceChanged); this.winGridViewPager1.gridView1.RowHeight 44; void gridView1_DataSourceChanged(object sender, EventArgs e) { RepositoryItemPictureEdit pic1 new RepositoryItemPictureEdit(); pic1.SizeMode DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom; pic1.NullText ; pic1.CustomHeight 44; pic1.BestFitWidth 100; this.winGridViewPager1.gridView1.Columns[Signature].ColumnEdit picFlight; this.winGridViewPager1.gridView1.Columns[Signature].MaxWidth 100; this.winGridViewPager1.gridView1.Columns[Signature].MinWidth 100; RepositoryItemPictureEdit picDoctor new RepositoryItemPictureEdit(); picDoctor.SizeMode DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom; picDoctor.NullText ; picDoctor.CustomHeight 44; picDoctor.BestFitWidth 100; this.winGridViewPager1.gridView1.Columns[DoctorSignature].ColumnEdit picDoctor; this.winGridViewPager1.gridView1.Columns[DoctorSignature].MaxWidth 100; this.winGridViewPager1.gridView1.Columns[DoctorSignature].MinWidth 100; }以上就基本上解决了签名以及图片保存以及列表显示图片效果的问题了。本文转载自博客园 - 伍华聪
返回列表