Quang
Quang

Reputation: 183

What is best way to write in windows forms with pen-tablet like wacom intuos in C#

i have a problem.

I'm writing a program that writes on it with a stylus.

First, i create a windows form with a panel.

enter image description here

second, this code:

using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using System.Diagnostics;
using System.Drawing.Drawing2D;

namespace testWrite
{
    public partial class Form1 : Form
    {
        Graphics g;
        int x = -1;
        int y = -1;
        bool moving = false;
        Pen pen;

        public Form1()
        {
            InitializeComponent();
            g = panel1.CreateGraphics();
            pen = new Pen(Color.Black, 5);
            pen.SetLineCap(System.Drawing.Drawing2D.LineCap.Round, System.Drawing.Drawing2D.LineCap.Round, System.Drawing.Drawing2D.DashCap.Round);
            pen.StartCap = System.Drawing.Drawing2D.LineCap.Round;
            pen.EndCap = System.Drawing.Drawing2D.LineCap.Round;
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if(e.Button == MouseButtons.Left)
            {
                g.DrawLine(pen, new Point(x, y), e.Location);
                x = e.X;
                y = e.Y;
            }
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            x = -1;
            y = -1;
            moving = false;
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            x = e.X;
            y = e.Y;
            moving = true;
        }
    }
}

I use this app with a Wacom intuos

enter image description here

But the result is not so good because a few words are lost...haizzz

toi tên la trần

quang hieu

hello heloo

enter image description here

especially, when i write fast or the text is small.

when i write in Microsoft Paint, it is very good

enter image description here What is best way to to write in windows forms with pen-tablet like wacom intuos?

UPDATE 1: With cmt from TaW.

enter image description here

Thanks for your help. But, that's not what I need...

i was change my code to:

public partial class Form1 : Form
{
    List<Point> curPoints = new List<Point>();
    List<List<Point>> allPoints = new List<List<Point>>();

    public Form1()
    {
        InitializeComponent();
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button != MouseButtons.Left) return;
        // here we should check if the distance is more than a minimum!
        curPoints.Add(e.Location);
        // let it show
        panel1.Invalidate();
    }

    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        if (curPoints.Count > 1)
        {
            // ToList creates a copy
            allPoints.Add(curPoints.ToList());
            curPoints.Clear();
        }
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        if (curPoints.Count > 1)
        {
            // begin fresh line or curve
            curPoints.Clear();
            // startpoint
            curPoints.Add(e.Location);
        }
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        // here you can use DrawLines or DrawCurve
        // current line
        if (curPoints.Count > 1) e.Graphics.DrawCurve(Pens.Red, curPoints.ToArray());
        // other lines or curves
        foreach (List<Point> points in allPoints)
            if (points.Count > 1) e.Graphics.DrawCurve(Pens.Red, points.ToArray());
    }
}

But nothing better. The result is worse...

enter image description here

I tried to write: "Hello my name is Hieu", but is not run...

Looks like a pen-tablet differs from a mouse when use to write. Because, with mouse i feel that is better in this code...

UPDATE 2:

With code by Idle_Mind. It will be fine if i set pen-tablet:

enter image description here

With setting "Click", it is not OK

enter image description here

How to fix it, i don't want to set "Double Click" to my pen !

Upvotes: 0

Views: 1306

Answers (1)

Idle_Mind
Idle_Mind

Reputation: 39122

Here's my version...worked great for me. You might need to adjust your tablet settings so that it picks up everything correctly:

public partial class FormTablet : Form
{

    private Point lastPoint;
    private GraphicsPath GP = null;
    private List<GraphicsPath> GPs = new List<GraphicsPath>();

    public FormTablet()
    {
        InitializeComponent();
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        pictureBox1.Invalidate();
    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            lastPoint = new Point(e.X, e.Y);
            GP = new GraphicsPath();
            GP.AddLine(lastPoint, lastPoint);
            GPs.Add(GP);
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            Point pt = new Point(e.X, e.Y);
            GP.AddLine(lastPoint, pt);
            lastPoint = pt;
            pictureBox1.Invalidate();
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        GP = null;
        pictureBox1.Invalidate();
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        if (checkBox1.Checked)
        {
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        }
        using(Pen p = new Pen(Color.Black, (int)numericUpDown1.Value))
        {
            p.LineJoin = LineJoin.Round;
            p.MiterLimit = p.Width / 2;
            foreach (GraphicsPath path in GPs)
            {
                if (path.PathPoints.Count() > 2)
                {
                    // draw the path
                    e.Graphics.DrawPath(p, path);
                }
                else
                {
                    // just draw a single dot
                    Rectangle rc = new Rectangle(Point.Round(path.PathPoints[0]), new Size(1, 1));
                    rc.Inflate((int)numericUpDown1.Value, (int)numericUpDown1.Value);
                    e.Graphics.FillEllipse(Brushes.Black, rc);
                }
            }
        }            
    }

    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        pictureBox1.Invalidate();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        GPs.Clear();
        pictureBox1.Invalidate();
    }

}

Upvotes: 1

Related Questions