Laden...

Linie Zeichnen mit GDI+

Erstellt von Gerri3d vor 6 Jahren Letzter Beitrag vor 6 Jahren 3.411 Views
G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren
Linie Zeichnen mit GDI+

Hallo, ich bin noch ziemlich am Anfang und wollte eine einfache Linie Testweise zeichnen.

Hier mal meine FOrm-Klasse:


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;

namespace DrawTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {




        }

        private void ShowLineJoin(PaintEventArgs e)
        {
            InitializeComponent();
            Graphics g;
            g = this.CreateGraphics();

            // Create a new pen.
            Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);

            // Set the pen's width.
            skyBluePen.Width = 8.0F;

            // Set the LineJoin property.
            skyBluePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;

            // Draw a rectangle.
            e.Graphics.DrawRectangle(skyBluePen,
                new Rectangle(40, 40, 150, 200));

            //Dispose of the pen.
            skyBluePen.Dispose();

        }
    }
}


was fehlt, um die Linie im Form darzustellen?

W
195 Beiträge seit 2008
vor 6 Jahren

Dein Code ist ziemlich wirr.

Wie kommt InitializeComponent() in die Methode ShowLineJoin - normalerweise wird diese im Constructor des Fensters aufgerufen?
Wo/wie wird ShowLineJoin aufgerufen?

Prinzipiell: Du musst Die Methode OnPaint überschreiben und/oder Dich an den Paint-Event des Fensters halten.

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo,

[Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox) liefert eine gute Grundlage übers Zeichnen. Schau dir das an und du wirst deine Frage lösen können 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

78 Beiträge seit 2016
vor 6 Jahren

Ich hab ja schon ewig kein GDI/GDI+ mehr gemacht ...

So sollte es gehen:


namespace MySuperDuperLinePainter
{
    public partial class Form1 : Form
    {
        private static Random random = new Random();

        public Form1()
        {
            InitializeComponent();
            ResizeRedraw = true;
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            using (var pen = new Pen(Color.FromArgb(random.Next(256), random.Next(256), random.Next(256)), 5))
            {
                e.Graphics.DrawLine(pen, new Point(0, 0), new Point(this.ClientRectangle.Width, this.ClientRectangle.Height));
            }
        }
    }
}

Nun sollte eine Linie von oben links nach unten rechts gezeichnet werden.
Zusätzlich wechselt die Farbe, wenn du die Größe des Fensters änderst.

Mit ...


e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias

... sieht die Linie dann auch nett aus.

http://dotnet-paderborn.azurewebsites.net/

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren

vielen Dank, ich habe nun versucht simple ein Rechteck zu Zeichnen.
Was auch irgendiwe schon läuft.
Wie kann ich das nun auf einer bestimmten tabPage darstellen?


protected override void OnPaint(PaintEventArgs e)
         {
             base.OnPaint(e);

             Graphics g = e.Graphics;

             g.DrawRectangle(Pens.Red, 25, 25, tabControlHelp.Width-50, tabControlHelp.Height-50);

         } 

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Gerri3d,

indem du im Paint-Ereignis der Tab-Page zeichnest. Das Zeichnen an sich ist genau gleich wie bisher. Nur eben nicht in OnPaint (bzw. im Paint-Ereignis der Form, Panel, etc.), sonder von jenem der Tab-Page.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren

wo definere ich das es nicht Fform sondern in der TabPage ist?

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Gerri3d,

indem du von der Tab-Page das Paint-Ereignis abonnierst und dann in dessen Event-Handler zeichnest.
Siehe [FAQ] Eigenen Event definieren / Information zu Events (Ereignis/Ereignisse)

In VS schau dir da bei den Eigenschaften der Tabpage die Ereignisse an (dort wo der Blitz ist).
Ähnlich wie du ein Button-Klick behandelst.

Bitte beachte bei weiteren Fragen auch [Hinweis] Wie poste ich richtig? Punkt 1, denn das sind schon elementare Grundlagen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren

vielen Dank, jetzt klappts. Stimmt schon, alles noch ziemlich schwammig, nur ist .Net, OOP und C# ein dermaßen großes Thema dass man das benötigte als Anfänger schwer bei speziellen Fragen findet.

Jedenfalls zur LÖSUNG:

Ich habe im Form1.Designer.cs das Event für den Tab hinzugefügt:


 this.tabPageDxf.Paint += new System.Windows.Forms.PaintEventHandler(this.tabPageDxf_Paint);

und dann meine Methode im Form1.cs geschrieben:


         private void tabPageDxf_Paint(object sender, PaintEventArgs e)
        {            
                Graphics g = e.Graphics;
                g.DrawRectangle(Pens.Red, 0, 0, tabPageDxf.Width-1, tabPageDxf.Height-1);
        }

Gruß Gerri3d