2017-06-08 1 views
2

Also mache ich eine Paint-App in C# und es funktioniert, indem Sie einen Punkt markieren, wenn der Benutzer auf die Farbpalette klickt, während der Benutzer mit der Maus eine Linie zieht, wenn die Maus an die neue Position bewegt wird ; Ich lerne C#, also ist es ziemlich einfach. Jetzt ist alles in Ordnung, bis ich den Stift bemale, wenn ich das tue, fangen die Linien an, komisch auszusehen? Kennt jemand irgendwelche möglichen Lösungen, um die Linie normal aussehen zu lassen?Wie macht man bessere Linien?

Weird Lines

hier ist mein Code, ich bin ein Windows-Formular App:

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.Windows.Forms; 
using Microsoft.VisualBasic; 
using System.Drawing.Drawing2D; 

namespace paintApplication 
{ 

    public partial class frmPaintApp : Form 
    { 
     /// <summary> 
     /// variables 
     /// </summary> 
     bool shouldPaint = false; 
     Point prePoint; 
     float penSize = 1; 
     Graphics g; 

     ColorDialog cd = new ColorDialog(); 

     public frmPaintApp() 
     { 
      InitializeComponent(); 
      g = pnlPaintPanel.CreateGraphics(); 
      g.SmoothingMode = SmoothingMode.AntiAlias; 
     } 

     private void msPensize_Click(object sender, EventArgs e) 
     { 

      if (float.TryParse(msTxtchoosesize.Text , out penSize)) 
      { 
       msTxtchoosesize.Text = ""; 
      } 
     } 

     private void pnlPaintPanel_MouseDown(object sender, MouseEventArgs e) 
     { 
      shouldPaint = true; 
      prePoint = new Point(e.X, e.Y); 
     } 

     private void pnlPaintPanel_MouseUp(object sender, MouseEventArgs e) 
     { 
      shouldPaint = false; 
     } 

     private void pnlPaintPanel_MouseMove(object sender, MouseEventArgs e) 
     { 
      Pen p = new Pen(cd.Color, penSize); 


      if (shouldPaint == true) 
      { 
       g.DrawLine(p, prePoint, new Point(e.X, e.Y)); 
      } 

      prePoint = new Point(e.X, e.Y); 

     } 

     private void msChoosecolor_Click(object sender, EventArgs e) 
     { 
      cd.ShowDialog(); 
     } 

     private void frmPaintApp_ResizeEnd(object sender, EventArgs e) 
     { 
      g = pnlPaintPanel.CreateGraphics(); 
      g.SmoothingMode = SmoothingMode.AntiAlias; 
     } 

     private void msClear_Click(object sender, EventArgs e) 
     { 
      g.Clear(pnlPaintPanel.BackColor); 

     } 

     private void msExit_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 

     private void pnlPaintPanel_Paint(object sender, PaintEventArgs e) 
     { 

     } 
    } 
} 
+2

Malen Kreise statt Linien würde helfen. – Carcigenicate

+2

Speichern Sie dieses Grafikobjekt niemals - es ist temporär. Verwenden Sie niemals CreateGraphics. Verwenden Sie das Paint-Event Ihres Panels, um alle Ihre Linien zu zeichnen, oder verwenden Sie eine Bitmap und zeigen Sie diese im Paint-Event an. Versuchen Sie, eine Stiftgröße von 45 zu verwenden? – LarsTech

+1

@Carcigenicate Vereinbart. Man könnte die Größe des Kreises an die Größe des "Stiftes" im Malprogramm binden. Eine feste Füllung auf einem Stift mit variabler Größe, der Kreise zeichnet, sollte genau das tun, was gewünscht wird. –

Antwort

1

Neben meiner Kommentare zu Create verwenden, etc, versuchen Sie linecaps zu wechseln (und des Stiftes verfügen, können Sie Speicherverlust):

using (Pen p = new Pen(Color.Black, penSize)) { 
    p.StartCap = LineCap.Round; 
    p.EndCap = LineCap.Round; 
    if (shouldPaint) { 
    g.DrawLine(p, prePoint, new Point(e.X, e.Y)); 
    } 
} 
+0

zu setzen? Das hat perfekt funktioniert! Danke: http://imgur.com/a/eNFSw –