Files

132 lines
4.8 KiB
C#
Raw Permalink Normal View History

2025-12-11 09:52:50 +08:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Diagnostics;
namespace WindowsFormsApp
{
public partial class PenDraw : UserControl
{
//GDI+
Graphics DrawGraphic = null;
//笔画坐标点
private List<Point> Stroke=new List<Point>();
//定义画布高792
private const int IMG_HEIGHT = 792;
//定义画布宽560
private const int IMG_WIDHT = 560;
//本示例适用于A4点阵纸书写相关尺寸根据A4点阵纸进行了缩放
//不同尺寸点阵纸点阵宽高尺寸计算方法为:纸张物理尺寸(毫米)/0.3 *8,详见 开发必读.pdf 文档
//A4点阵纸点阵高度
private const int A4_DOT_HEIGHT = 7920;
//A4点阵纸点阵宽度
private const int A4_DOT_WIDTH = 5600;
//序列号
private string PenSerial = string.Empty;
public PenDraw(string penSerial)
{
PenSerial = penSerial;
InitializeComponent();
InitDraw();
this.Width = 280;
this.Height = 396;
}
private void InitDraw()
{
Bitmap bitmap = new Bitmap(IMG_WIDHT, IMG_HEIGHT);
DrawGraphic = Graphics.FromImage(bitmap);
double scale = IMG_HEIGHT * 1.0 / A4_DOT_HEIGHT;
DrawGraphic.FillRectangle(Brushes.AliceBlue, 0, 0, IMG_WIDHT, IMG_HEIGHT);
DrawGraphic.DrawString(PenSerial, new Font("宋体", 45), Brushes.Black, 0, 0);
pictureBox.Image = bitmap;
DrawGraphic.ScaleTransform((float)scale, (float)scale);
DrawGraphic.SmoothingMode = SmoothingMode.AntiAlias;
}
public void OnPenDown(ulong time, string penSerial, int penType)
{
}
//抬笔后将坐标一次性画出
public void OnPenUp(ulong time, string penSerial, int penType)
{
if (this.InvokeRequired)
{
Action<ulong, string, int> action = new Action<ulong, string, int>(OnPenUp);
this.Invoke(action, new object[] { time, penSerial, penType });
}
else
{
int leftPoints = Stroke.Count % 3;
if (0 != leftPoints)
{
int from = Stroke.Count - leftPoints - 1;
if (from < 0)
from = 0;
int to = Stroke.Count - 1;
DrawCoordinates(from, to);
}
Stroke.Clear();
}
}
private void DrawCoordinates(int from, int to)
{
if (pictureBox.InvokeRequired)
{
Action<int, int> action = new Action<int, int>(DrawCoordinates);
this.Invoke(action, new object[] { from, to });
}
else
{
Point[] points = new Point[to - from + 1];
int l = Stroke[from].X, r = Stroke[from].X, t = Stroke[from].Y, b = Stroke[to].Y;
for (int i = from; i <= to; i++)
{
points[i - from] = Stroke[i];
l = Math.Min(l, Stroke[i].X);
r = Math.Max(r, Stroke[i].X);
t = Math.Min(t, Stroke[i].Y);
b = Math.Max(b, Stroke[i].Y);
}
Pen pen = new Pen(new SolidBrush(Color.Blue), 3);
if (points.Length == 1)
DrawGraphic.DrawLine(pen, points[0], points[0]);
else if (points.Length == 2)
DrawGraphic.DrawLine(pen, points[0], points[1]);
else
DrawGraphic.DrawCurve(pen, points);
pen.Dispose();
l = (int)(1.0 * l / A4_DOT_WIDTH * pictureBox.Width) - 5;
r = (int)(1.0 * r / A4_DOT_WIDTH * pictureBox.Width) + 5;
t = (int)(1.0 * t / A4_DOT_HEIGHT * pictureBox.Height) - 5;
b = (int)(1.0 * b / A4_DOT_HEIGHT * pictureBox.Height) + 5;
Rectangle rec = new Rectangle(l, t, r - l, b - t);
pictureBox.Invalidate(rec);
}
}
public void OnPenCoordinate(ulong time, string penSerial, int penType, string pageSerial, int cx, int cy, ushort force)
{
Stroke.Add(new Point(cx, cy));
if (Stroke.Count % 3 == 0)
{
int from = Stroke.Count - 3 - 1;
if (from < 0)
from = 0;
int to = Stroke.Count - 1;
DrawCoordinates(from, to);
}
}
}
}