由于项目的需要,需要在项目的Winform系统的一个模块中集成手写签名功能,一开始对这部分不太了解,只是知道他可以代替鼠标签名。MART)由于是签名,所以一般应将原告照片作为记录验证的凭证记录下来。因为有效的签名很难模拟。市场上也有各种类型的电子签名笔,有一段时间不知道这样对不对。本文主要从签字笔的选择形式及功能实现等方面分析和介绍这一要求,希望能为处境相同的朋友提供参考。
1、电子手写签名介绍。
电子手写签名是模拟实际笔签名的过程。我主要介绍使用外部设备记录文稿照片的要求,这类似于将实际纸上的签名内容放在计算机记录面板上。此操作模拟实际上是使用与鼠标功能类似的接触笔来实现的。
有些笔在纸或电脑屏幕上进行模拟签名,通过一个接收器接受笔的接触信号,一般先设置纸或屏幕的范围,然后再签名。如下所示。
签名笔淘宝也很多,所以开始找这种,但是效果不好,总感觉位置不准确,和鼠标发生严重冲突,基本无法操作。商家客服说这种现象很少发生,但发生在我身上,只能退货。然后找到了一个国王写字板笔,一开始还可以用。其实是代替鼠标操作的。尝试后保留了。写字板的大致风格和下图差不多。
一直是用鼠标模拟签名开发的,写这篇作文的时候想展示效果,可惜写不出来,不知道是什么原因。
在开发签名功能时,其实我不在乎手写笔功能。因为我认为,实际上鼠标可以工作,手写笔也必须实际工作。因此,只需输入鼠标操作的痕迹。只需要类似手写签名的效果。大致如下。
2,实施手写签名
如上图所示,为了记录鼠标轨迹,只需提供绘图等面板。也就是说,它的功能与Windows固有的白板(或数字化仪)软件略有相似。
实际上,要模拟鼠标签名的效果,只需使用功能强大的GraphicsPath对象即可。其馀的是录制点和绘图点,以及设置绘图笔的宽度和颜色。让我们看一下具体的实现代码。
首先要明确传达相关信息所需的几个对象。
//记录直线或曲线的对象
private Sy mouse path=new Sy();
//画笔透明度
Private int myAlpha=100
//笔刷颜色对象
private color my user color=new color();
//画笔宽度
private int myPenWidth=3;
//已签名的图片对象
Public Bitmap SavedBitmap如上图所示,放置图片面板的只是PictureBox对象,如果在PictureBox对象上记录鼠标移动、鼠标按下和对象刷新操作事件,则可以达到模拟签名效果,如下所示:
9719692f67e4?from=article.detail&_iz=31825&index=5" width="20" height="20"/> private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if == Sy)
{
try
{
mou, e.Y, e.X, e.Y);
}
catch (Exception ex)
{
Me);
}
}
();
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if == Sy)
{
mou();
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
try
{
myUserColor = Sy;
myAlpha = 255;
Pen CurrentPen = new Pen(myAlpha, myUserColor), myPenWidth);
e.Gra(CurrentPen, mousePath);
}
catch { }
}
保存及清空操作,其实很简单,清空的时候,记得把绘图面板清空,并重置路径对象即可。保存也是记录PictureBox对象的大小宽度,把图片存储到图片对象里面,供控件使用。
具体实现如下所示。
private void btnClear_Click(object sender, EventArgs e)
{
().Clear);
mou();
}
private void btnSave_Click(object sender, EventArgs e)
{
SavedBitmap = new Bitma, );
(SavedBitmap, new Rectangle(0, 0, , ));
= Sy;
}
上面实现还不能完成一个最终的签名效果,有时候,我们需要把这些图片放到数据库里面,如果是把上面的操作的图片记录下来,发现很大,一般我们签名的效果显示,不会很大,一方面只需要辨认其笔迹即可,另外一方面也不会过于增大数据库的存储空间。那么我们就需要对图片大小进行一定的处理了。其实可能在详细信息里面,我们就这样记录显示即可。那么就一定要裁剪图片的大小。
以上的医生签名,我们触发的操作就是弹出一个签名窗体,在其中绘制签名,确认后返回,并把图片进行显示在详细信息窗体里面。
private void btnDoctorSign_Click(object sender, EventArgs e)
{
FrmSignicture dlg = new FrmSignicture();
if () == Sy)
{
= dlg.SavedBitmap;
}
}
为了安装最终显示的PictureBox的大小保存图片,我们需要裁减,裁减就是重新根据图片大小进行保存Bitmap对象,这种可以从全屏最初的几M缩小到十几K,方便存储。
至于图片对象存储到数据库,这个由于利用了我Winform开发框架里面的数据库基础对象,基本上不需要特别对待及处理,只需要把图片字段的Byte数组获得即可了。这里就不在赘述Winform开发框架的功能及相关的基类处理了。
public Bitmap SaveImage(PictureBox pictureBox1)
{
Bitmap SavedBitmap = new Bitma, );
(SavedBitmap, new Rectangle(0, 0, , ));
return SavedBitmap;
}
最后,有时候,签名还需要在列表里面显示,这样方便对一些关键信息进行查看核对。如下图所示
那么对于列表中显示图片,我们在DevExpress界面的分页控件中应该如何处理呢,这估计也是DevExpress开发中很多常见问题之一?
其实也很简单,就是在DataSourceChanged 变化的事件中改变单元格的对象属性即可。
+= new EventHandler(winGridViewPager1_OnRefresh);
= true;
= DevEx;
= DevEx;
= ;
+= new EventHandler(gridView1_DataSourceChanged);
= 44;
void gridView1_DataSourceChanged(object sender, EventArgs e)
{
RepositoryItemPictureEdit pic1 = new RepositoryItemPictureEdit();
= DevEx;
= " ";
= 44;
= 100;
["Signature"].ColumnEdit = picFlight;
["Signature"].MaxWidth = 100;
["Signature"].MinWidth = 100;
RepositoryItemPictureEdit picDoctor = new RepositoryItemPictureEdit();
= DevEx;
= " ";
= 44;
= 100;
["DoctorSignature"].ColumnEdit = picDoctor;
["DoctorSignature"].MaxWidth = 100;
["DoctorSignature"].MinWidth = 100;
}
以上就基本上解决了,签名,以及图片保存,以及列表显示图片效果的问题了。