using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using System.Globalization; using Functions.FileExt; using System.IO; //0816加实时报点 [StructLayout(LayoutKind.Sequential)] public struct TOUCH_INFO { public int X; public int Y; public int Pressure; public int SN; public int btnID;//5寸 确定 重签 取消按钮 } namespace DevicesService.Devices { public class SignDll { public static PointF endPos; public static int status = -1; public static PointF beginPos; public static PointF frontPos; private static int xypointcount; private static int[] lastpointx = new int[3]; private static int[] lastpointy = new int[3]; Point mPoint = new Point(-1, -1); private System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red); private Bitmap bitmap = new Bitmap(594, 392); private static Graphics g; private static Pen pen = new Pen(Color.Red); public SignDll() { endPos = new PointF(-1F, -1f); beginPos = new PointF(-1F, -1f); frontPos = new PointF(-1F, -1f); lastpointx[0] = -1; lastpointy[0] = -1; lastpointx[1] = -1; lastpointy[1] = -1; lastpointx[2] = -1; lastpointy[2] = -1; xypointcount = 0; g = Graphics.FromImage(bitmap); g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; } public static void GetTouchNumber(int number) { if (number == 1) { int ret = FiveInchDll.ComSignOK(); } else { g.Clear(System.Drawing.Color.White); lastpointx[0] = -1; lastpointy[0] = -1; lastpointx[1] = -1; lastpointy[1] = -1; lastpointx[2] = -1; lastpointy[2] = -1; } } //0816加报点 public static void GetTouchPoint(TOUCH_INFO[] info1) { int x = 0, y = 0; int pressurevl; int dx = 0, dy = 0; for (int k = 0; k < 80; k++) { x = info1[k].X; y = info1[k].Y; if (info1[k].Pressure > 0) { if (info1[k].Pressure > 0 && info1[k].Pressure < 500) { pressurevl = 1; pen.Width = 1; } else if (info1[k].Pressure >= 500 && info1[k].Pressure < 1000) { pressurevl = 2; pen.Width = 2; } else if (info1[k].Pressure >= 1000 && info1[k].Pressure < 1500) { pressurevl = 3; pen.Width = 3; } else if (info1[k].Pressure >= 1500 && info1[k].Pressure < 2048) { pressurevl = 4; pen.Width = 4; } else { pressurevl = 0; pen.Width = 1; } } else { pressurevl = 0; lastpointx[0] = -1; lastpointy[0] = -1; lastpointx[1] = -1; lastpointy[1] = -1; lastpointx[2] = -1; lastpointy[2] = -1; continue; } if (info1[k].Pressure > 10) //有画线宽度 { lastpointx[2] = x; lastpointy[2] = y; if (lastpointx[2] != -1) { if (lastpointx[1] != -1 && lastpointx[0] != -1) { //float dx = Math.Abs(lastpointx[2] - beginPos.X); //float dy = Math.Abs(endPos.Y - beginPos.Y); dx = Math.Abs(lastpointx[2] - lastpointx[1]); dy = Math.Abs(lastpointy[2] - lastpointy[1]); if ((dx != 0) && (dy != 0)) { if (lastpointy[1] != -1 && lastpointy[2] != -1) //y轴相同的点不画,直接跳过 { if (lastpointx[1] != -1 && lastpointx[2] != -1) //第3个点和第二个点比较是否x坐标在同一个位置,不是就执行画第一个点到第二个点的线 { //painter->drawLine(frontPos, beginPos); //画线 g.DrawLine(pen, lastpointx[0], lastpointy[0], lastpointx[1], lastpointy[1]); //painter->drawPoint(beginPos); //画点 //frontPos = beginPos; //beginPos = endPos; lastpointx[0] = lastpointx[1]; lastpointy[0] = lastpointy[1]; lastpointx[1] = lastpointx[2]; lastpointy[1] = lastpointy[2]; } else { //是就执行画第一个点到第三个点的线 //painter->drawLine(frontPos, endPos); g.DrawLine(pen, lastpointx[0], lastpointy[0], lastpointx[2], lastpointy[2]); //frontPos = endPos; //第三个点赋值第一个点 //beginPos = QPointF(0, 0); //第二个点置空 //beginPos.X = -1; //beginPos.Y = -1; lastpointx[0] = lastpointx[2]; lastpointy[0] = lastpointy[2]; lastpointx[1] = -1; lastpointy[1] = -1; } } } }// else { if (lastpointx[1] != -1) //不为空在赋值,防止丢弃点时赋空值 { lastpointx[0] = lastpointx[1]; lastpointy[0] = lastpointy[1]; } lastpointx[1] = lastpointx[2]; lastpointy[1] = lastpointy[2]; } } } else { dx = dy = 0; lastpointx[0] = -1; lastpointy[0] = -1; lastpointx[1] = -1; lastpointy[1] = -1; lastpointx[2] = -1; lastpointy[2] = -1; } } } //打开签字版 public static int OpenComDevice() { if (status == -1) { status = FiveInchDll.OpenComDevice(GetTouchNumber); if (status != 0) { status = -1; } } return status; } //关闭签字版 public static int CloseComDevice() { int ret = -1; if (status == 0) { ret = FiveInchDll.CloseComDevice(); if (ret == 0) { status = -1; } } return ret; } //保存签字版数据 public static string ComSetPictureSavePath() { try { DateTime dateTime = DateTime.Now; string time = DateTime.Now.ToString( "yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo); var dirpath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "Sign"); FileExt.MakeSureDirExist(dirpath); var filepath = Path.Combine(dirpath, time); string SignFile = dirpath + "\\" + time + ".png"; string sourcepaht = Environment.CurrentDirectory + "\\fiveInch.png"; int ret = FiveInchDll.ComSignOK(); if (ret == 0) { return SignFile; } else { return ""; } } catch (Exception ex) { return ""; } } } class FiveInchDll { [System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute(System.Runtime.InteropServices.CallingConvention.StdCall)] public delegate void GetTouchNumber(int number); //0816加报点 [System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute(System.Runtime.InteropServices.CallingConvention.StdCall)] public delegate void TOUCH_INFO_FUNC([MarshalAs(UnmanagedType.LPArray, SizeConst = 160)] TOUCH_INFO[] info); [DllImport("XTJZFiveInch.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int ComSendPoint(int nState, [MarshalAs(UnmanagedType.FunctionPtr)] TOUCH_INFO_FUNC callback); //0816加报点 [DllImport("XTJZFiveInch.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int OpenComDevice([MarshalAs(UnmanagedType.FunctionPtr)] GetTouchNumber callback); [DllImport("XTJZFiveInch.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int CloseComDevice(); [DllImport("XTJZFiveInch.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int ComSetSignBackgroundImage(string UIFile); [DllImport("XTJZFiveInch.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int ComSetPictureSavePath(string PicturePath, int PicturePathLen); [DllImport("XTJZFiveInch.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int ComSignOK(); } }