using Common.system; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using TStudyDigitalPen.HID; namespace XHPZ.Desktop { /// /// PracticeWindow.xaml 的交互逻辑 /// public partial class PracticeWindow : Window { private DrawingAttributes drawingAttributes; private DrawingAttributes drawing; /// /// 屏幕宽 /// internal double pwidth = SystemParameters.PrimaryScreenWidth; /// /// 屏幕高 /// internal double pHeight = SystemParameters.PrimaryScreenHeight; /// /// 当前画笔颜色 /// private Color Colour = Colors.Red; /// /// 当前画笔宽 /// private int Wit = 2; /// /// A4点阵纸点阵宽度 /// private const int A4_WIDTH = 5600; /// /// A4点阵纸点阵高度 /// private const int A4_HEIGHT = 7920; /// /// 引用user32.dll动态链接库(windows api), /// 使用库中定义 API:SetCursorPos /// 设置光标位置 /// [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern int SetCursorPos(int x, int y); public PracticeWindow() { InitializeComponent(); InitPen(); InitTQLPPen(); } /// /// 初始化 /// /// public void Initialize(string _imgPath = null) { blackboard_canvas.Strokes.Clear(); blackboard_canvas.UseCustomCursor = true; //创建 DrawingAttributes 类的一个实例 drawingAttributes = new DrawingAttributes(); blackboard_canvas.DefaultDrawingAttributes = drawingAttributes; Pen(); } public void InitPen() { //stroke = new List(); //获取点阵笔实例,并绑定点阵笔事件 //将授权文件内容传入,获取点阵笔对象实例 APP.digitalPen = DigitalPenHID.GetInstance(certificates.MyLicense.Bytes); //绑定笔连接事件 APP.digitalPen.PenConnected += OnPenConnect; //绑定笔断开事件 APP.digitalPen.PenDisconnect += OnPenDisconnect; //绑定笔书写输出坐标事件 APP.digitalPen.PenCoordinate += OnPenCoordinate; //绑定抬笔事件 APP.digitalPen.PenUp += OnPenUp; //绑定落笔事件 APP.digitalPen.PenDown += OnPenDown; APP.digitalPen.PenBatteryCapacity += OnBatteryCapacity; APP.digitalPen.PenMemoryFillLevel += OnMemoryFillLevel; //完成初始化点阵笔,开始与点阵笔通信 ERROR_CODE ER = APP.digitalPen.Start(); //判断是否成功 //if (ER != ERROR_CODE.ERROR_OK) //{ // MessageWindow.Show("初始化失败,授权过期,返回值:" + ER.ToString()); //} } /// /// 画笔 /// public void Pen() { blackboard_canvas.EditingMode = InkCanvasEditingMode.Ink; blackboard_canvas.UseCustomCursor = true; drawingAttributes.FitToCurve = true; drawingAttributes.IgnorePressure = false; blackboard_canvas.Cursor = Cursors.Pen; } /// /// 笔连接 /// /// 时间戳,1970年1月1日到现在的总毫秒数 /// 点阵笔序列号 /// 点阵笔型号编号 private void OnPenConnect(ulong time, string penSerial, int penType) { if (CheckAccess()) { Action action = new Action(OnPenConnect); Dispatcher.Invoke(action, new object[] { time, penSerial, penType }); } else { APP.PenSerial = penSerial; APP.PenStatus = true; this.penSerial = penSerial; //连接后,在获取笔数据前,可以清除笔内的历史数据 //APP.digitalPen.ClearMemory(penSerial); //开始接收笔数据 APP.digitalPen.GetPenData(penSerial); APP.W_mainWindow.UpdateDevStatus(); ////Dispatcher.Invoke(new Action(() => ////{ //// txbNotConnected.Text = "已连接"; //// txbNotConnecteds.Text = "已连接"; ////})); } } /// /// 笔断开 /// /// 时间戳,1970年1月1日到现在的总毫秒数 /// 点阵笔序列号 /// 点阵笔型号编号 private void OnPenDisconnect(ulong time, string penSerial, int penType) { if (CheckAccess()) { Action action = new Action(OnPenDisconnect); Dispatcher.Invoke(action, new object[] { time, penSerial, penType }); } else { APP.PenSerial = penSerial; APP.PenStatus = false; APP.W_mainWindow.UpdateDevStatus(); //UpdateDevStatus(); ////Dispatcher.Invoke(new Action(() => ////{ //// txbNotConnected.Text = "未连接"; //// txbNotConnecteds.Text = "未连接"; ////})); } } /// /// 笔序列号 /// private string penSerial; /// /// 笔是否在点 /// private bool isPenDown; /// /// 笔书写,收到坐标 /// /// 时间戳,1970年1月1日到现在的总毫秒数 /// 点阵笔序列号 /// 点阵笔型号编号 /// 点阵地址 /// x坐标 /// y坐标 /// 压力值 private void OnPenCoordinate(ulong time, string penSerial, int penType, string pageSerial, int cx, int cy, byte force) { if (this.Visibility == Visibility.Visible) { if (CheckAccess()) { Action ac = new Action(OnPenCoordinate); Dispatcher.Invoke(ac, new object[] { time, pageSerial, penType, pageSerial, cx, cy, force }); } else { //判断是否是落笔后输出的坐标,在设置悬浮模式下,落笔前的悬浮坐标不绘制 if (!isPenDown) { return; } //stroke.Add(new System.Drawing.Point(cx, cy)); double PropW = blackboard_canvas.ActualWidth / A4_HEIGHT; double PropH = blackboard_canvas.ActualHeight / A4_WIDTH; //点 double testX = cy * PropW; double testY = (A4_WIDTH - cx) * PropH; //pageSerial //点阵IP地址 与打印的页面关联 if (true) { Dispatcher.Invoke(new Action(() => { float Pressure = force / 100f; ////添加笔画 //myblackboard.changepages(testX, testY, false, Color, PenSize, APP.pageData.currpage - 1, Pressure); if (isFirst) { stylusPoint.X = testX; stylusPoint.Y = testY; //_color.A = (byte)(Pressure * 255f); //stylusPoint.PressureFactor = Pressure; //for(int i=0;i<100;i++) //{ // stylusPoint.X--; // stylusPoint.Y--; // stylusPoints.Add(stylusPoint); //} stylusPoints.Add(stylusPoint); if (stylusPoints.Count > 1) { drawing = new DrawingAttributes { Color = Colour, Width = Wit * 4.5, Height = Wit * 4.5, FitToCurve = true, IgnorePressure = false }; //blackboard_canvas.Strokes = new StrokeCollection(); strokes = new Stroke(stylusPoints); strokes.DrawingAttributes = drawing; //blackboard_canvas.Strokes.Add(strokes); blackboard_canvas.Strokes.Add(strokes); isFirst = false; } } else { if (blackboard_canvas.Strokes.Count > 0) { stylusPoint.X = testX; stylusPoint.Y = testY; stylusPoints.Add(stylusPoint); strokes = new Stroke(stylusPoints); drawing = new DrawingAttributes { Color = Colour, Width = Wit * 4.5, Height = Wit * 4.5, FitToCurve = true, IgnorePressure = false }; strokes.DrawingAttributes = drawing; //viewModel.InkStrokes.Add(strokes); blackboard_canvas.Strokes[blackboard_canvas.Strokes.Count - 1] = strokes; } } //设置鼠标位置 if (testX > 0 && testY > 0) { //System.Windows.Point getP = scroMain.PointToScreen(new System.Windows.Point(testX, testY - scroMain.VerticalOffset)); SetCursorPos((int)((float)testX * (PrimaryScreen.DpiX / 96f)), (int)((float)testY * (PrimaryScreen.DpiY / 96f))); } })); } } } } bool isFirst = true; private StylusPointCollection stylusPoints = new StylusPointCollection(); private StylusPoint stylusPoint = new StylusPoint(); private Stroke strokes; /// /// 抬笔 /// /// 时间戳,1970年1月1日到现在的总毫秒数 /// 点阵笔序列号 /// 点阵笔型号编号 private void OnPenUp(ulong time, string penSerial, int penType) { if (CheckAccess()) { Action action = new Action(OnPenUp); Dispatcher.Invoke(action, new object[] { time, penSerial, penType }); } else { isPenDown = false; APP.PenSerial = penSerial; //stroke.Clear(); } //if (APP.pageData.currpage > 0) //{ // Dispatcher.Invoke(new Action(() => // { // myblackboard.changepages(0, 0, true, Color, PenSize, APP.pageData.currpage - 1, 0); // })); //} if (strokes != null && strokes.StylusPoints.Count > 1) { isFirst = true; } stylusPoints = new StylusPointCollection(); stylusPoint = new StylusPoint(); strokes = null; } /// /// 落笔 /// /// 时间戳,1970年1月1日到现在的总毫秒数 /// 点阵笔序列号 /// 点阵笔型号编号 private void OnPenDown(ulong time, string penSerial, int penType) { if (CheckAccess()) { Action action = new Action(OnPenDown); Dispatcher.Invoke(action, new object[] { time, penSerial, penType }); } else { isPenDown = true; if (APP.W_PracticeWindow != null && APP.W_PracticeWindow.Visibility == Visibility.Hidden) { PenPractice(); } } } void PenPractice() { Dispatcher.Invoke(() => { if (APP.W_PracticeWindow == null) { APP.W_PracticeWindow = new PracticeWindow { Width = pwidth, Height = pHeight, Left = 0, Top = 0 }; } APP.W_PracticeWindow.Topmost = true; APP.W_PracticeWindow.Initialize(); APP.W_PracticeWindow.Show(); }); } /// /// 电池电量 /// /// /// /// /// private void OnBatteryCapacity(ulong time, string penSerial, int penType, byte capacity) { if (CheckAccess()) { Action action = new Action(OnBatteryCapacity); Dispatcher.Invoke(action, new object[] { time, penSerial, penType, capacity }); } else { //System.Windows.MessageWindow.Show("电池电量:" + capacity.ToString()); } } /// /// 已用存储 /// /// /// /// /// private void OnMemoryFillLevel(ulong time, string penSerial, int penType, byte fillLevel) { if (CheckAccess()) { Action action = new Action(OnMemoryFillLevel); Dispatcher.Invoke(action, new object[] { time, penSerial, penType, fillLevel }); } else { //System.Windows.MessageWindow.Show("存储:" + fillLevel.ToString()); } } /// /// 退出批注 /// /// /// private void blackboard_canvas_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) { ReturnPractice(); SwitchPages(); } /// /// 退出批注并清空画板 /// public void ReturnPractice() { blackboard_canvas.Strokes.Clear(); new Thread(new ThreadStart(new Action(() => { Thread.Sleep(500); Dispatcher.Invoke(() => { Owner = null; APP.W_PracticeWindow.Hide(); }); }))).Start(); } /// /// 鼠标中建点击 /// void SwitchPages() { try { new Thread(() => { Thread.Sleep(500); MouseEventCommon.MouseMiddleClickEvent(0); }).Start(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } #region 腾千里手写笔 /// /// 是否在书写 /// bool isTQLPenDown = false; /// /// TQL点阵笔宽高 /// static float TQLA4_WIDTH = (float)1075 / (float)150 * (float)25.4 / (float)1.524; //OID4 static float TQLA4_HEIGHT = (float)1512 / (float)150 * (float)25.4 / (float)1.524; /// /// 初始化 /// public void InitTQLPPen() { if (APP.TQLPenevents == null) { APP.TQLPenevents = new PenEvents(); } } /// /// 笔落下 /// public void TQLDown() { isTQLPenDown = true; if(APP.W_PracticeWindow!=null&&APP.W_PracticeWindow.Visibility==Visibility.Hidden) { PenPractice(); } if (strokes != null && strokes.StylusPoints.Count > 1) { isFirst = true; } stylusPoints = new StylusPointCollection(); stylusPoint = new StylusPoint(); strokes = null; } /// /// 笔抬起 /// public void TQLUp() { isTQLPenDown = false; if (strokes != null && strokes.StylusPoints.Count > 1) { isFirst = true; } stylusPoints = new StylusPointCollection(); stylusPoint = new StylusPoint(); strokes = null; } /// /// 笔书写 /// /// /// /// public void TQLPenWrite(double cx, double cy, int force) { if (this.Visibility == Visibility.Visible) { //判断是否是落笔后输出的坐标,在设置悬浮模式下,落笔前的悬浮坐标不绘制 if (!isTQLPenDown) { return; } double PropW = blackboard_canvas.ActualWidth / TQLA4_HEIGHT; double PropH = blackboard_canvas.ActualHeight / TQLA4_WIDTH; double tempX = cy * PropW; double tempY = (TQLA4_WIDTH - cx) * PropH; Dispatcher.Invoke(new Action(() => { //0~1023,亦即有 1024 阶供应用软件后续应用之用,如笔锋笔触,暂无用 float Pressure = (float)force / 1023f; //添加笔画 if (isFirst) { stylusPoint.X = tempX; stylusPoint.Y = tempY; stylusPoints.Add(stylusPoint); if (stylusPoints.Count > 1) { drawing = new DrawingAttributes { Color = Colour, Width = Wit * 4.5, Height = Wit * 4.5, FitToCurve = true, IgnorePressure = false }; strokes = new Stroke(stylusPoints); strokes.DrawingAttributes = drawing; blackboard_canvas.Strokes.Add(strokes); isFirst = false; } } else { if (blackboard_canvas.Strokes.Count > 0) { stylusPoint.X = tempX; stylusPoint.Y = tempY; stylusPoints.Add(stylusPoint); strokes = new Stroke(stylusPoints); drawing = new DrawingAttributes { Color = Colour, Width = Wit * 4.5, Height = Wit * 4.5, FitToCurve = true, IgnorePressure = false }; strokes.DrawingAttributes = drawing; //viewModel.InkStrokes.Add(strokes); blackboard_canvas.Strokes[blackboard_canvas.Strokes.Count - 1] = strokes; } } //设置鼠标位置 if (tempX > 0 && tempY > 0) { //System.Windows.Point getP = scroMain.PointToScreen(new System.Windows.Point(testX, testY - scroMain.VerticalOffset)); SetCursorPos((int)((float)tempX * (PrimaryScreen.DpiX / 96f)), (int)((float)tempY * (PrimaryScreen.DpiY / 96f))); } })); } } #endregion private void Window_Loaded(object sender, RoutedEventArgs e) { Hide(); } } }