Zeichnen auf Panel

sailer86

Grünschnabel
Hi,

ich habe einen Toolstrip button und will wenn dieser geklickt wurde eine Linie auf ein Panel zeichnen. Aber irgendwie funktioniert mein Code nicht richtig. Er zeichnet nichts.
Code:
private void zeichnen_Click(object sender, EventArgs e)
        {
            this.zeichnen.CheckState = System.Windows.Forms.CheckState.Checked;
            this.anlageplan.Cursor = System.Windows.Forms.Cursors.Hand;
            this.anlageplan.MouseDown += new System.Windows.Forms.MouseEventHandler(this.zeichnen_MouseDown);
            this.anlageplan.MouseMove += new System.Windows.Forms.MouseEventHandler(this.zeichnen_MouseMove);
            this.anlageplan.MouseUp += new System.Windows.Forms.MouseEventHandler(this.zeichnen_MouseUp);
        }

        private void zeichnen_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;

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

            mouseDown = true;
            pfad.StartFigure();
        }

        private void zeichnen_MouseMove(object sender, MouseEventArgs e)
        {
            if (!mouseDown)
                return;
          
            Point newPoint = new Point(e.X, e.Y);

             Graphics grafik = CreateGraphics();

            //Linie vom Start zum Endpunkt ziehen
            grafik.DrawLine(new Pen(ForeColor), start, newPoint);
            grafik.Dispose();

            //Alle Linien werden gespeichert
            pfad.AddLine(start, newPoint);

            //Neuen Startpunkt setzen
            start = newPoint;
            this.Invalidate();           
        }

        private void zeichnen_MouseUp(object sender, MouseEventArgs e)
        {
            mouseDown = false;
            this.zeichnen.CheckState = System.Windows.Forms.CheckState.Unchecked;
            this.anlageplan.Cursor = System.Windows.Forms.Cursors.Default;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.DrawPath(new Pen(ForeColor), pfad);
        }

weis jemand vielleicht warum?

LG
sailer
 
Im Moment zeichnet der Code sehr wohl, allerdings vielleicht nicht so, wie du vorhast. Du klickst auf den Button. Ab diesem Moment hast du im Panel einen Hand-Cursor. Wenn du jetzt darin klickst und die Maus bewegst, dann wird im Fenster, in dem das Panel liegt, also nicht im Panel selber, gezeichnet. Das heißt, wenn das Panel das komplette Fenster ausfüllt, wirst du nichts sehen können, da das Panel die Zeichnung verdeckt.
 
Hi,

danke für die Antwort. Das wusste ich nicht. Ich dachte in meinem Code stimmt irgendwas nicht. Darauf wäre ich nie gekommen. Weist du zufällig was ich tun muss um dies zu umgehen? Was ich an meinem Code ändern muss damit er im Panel zeichnet?

lg
 
Die Lösung ist eigentlich ganz einfach. Du überschreibst beim Panel einfach die OnPaint-Methode. Hier einmal meine ZeichenPanel-Klasse:

Code:
    public class ZeichenPanel : Panel
    {
        Point start;
        bool mouseDown;
        GraphicsPath pfad = new GraphicsPath();

        private void zeichnen_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;

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

            mouseDown = true;
            pfad.StartFigure();
        }

        private void zeichnen_MouseMove(object sender, MouseEventArgs e)
        {
            if (!mouseDown)
                return;

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

            Graphics grafik = CreateGraphics();

            //Linie vom Start zum Endpunkt ziehen
            grafik.DrawLine(new Pen(ForeColor), start, newPoint);
            grafik.Dispose();

            //Alle Linien werden gespeichert
            pfad.AddLine(start, newPoint);

            //Neuen Startpunkt setzen
            start = newPoint;
            this.Invalidate();
        }

        private void zeichnen_MouseUp(object sender, MouseEventArgs e)
        {
            mouseDown = false;
            this.Cursor = System.Windows.Forms.Cursors.Default;
        }

        protected override void OnEnabledChanged(EventArgs e)
        {
            base.OnEnabledChanged(e);

            if (this.Enabled == true)
            {
                this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.zeichnen_MouseDown);
                this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.zeichnen_MouseMove);
                this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.zeichnen_MouseUp);
            }
            else
            {
                this.MouseDown -= new System.Windows.Forms.MouseEventHandler(this.zeichnen_MouseDown);
                this.MouseMove -= new System.Windows.Forms.MouseEventHandler(this.zeichnen_MouseMove);
                this.MouseUp -= new System.Windows.Forms.MouseEventHandler(this.zeichnen_MouseUp);
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.DrawPath(new Pen(Brushes.Black), pfad);
        }
    }

Jetzt entfernst du dein Panel aus dem Fenster und kompilierst das Ganze einmal. Dann sollte im Designer in der Toolbox ganz oben ein neues Element aufgetaucht sein: "ZeichenPanel". Dieses fügst du anstatt des alten Panels ein und stellst es standardmäßig auf "Disabled". Jetzt kommt in den EventHandler dieses Buttons das hier:

Code:
            this.anlageplan.Cursor = System.Windows.Forms.Cursors.Hand;
           this.anlageplan.Enabled = true;

Das wars eigentlich schon. Wichtig ist, dass das so wie ichs programmiert habe, nur funktioniert, wenn du das Panel zuerst deaktiviert hast und dann einschaltest, was einfach an diesem "OnEnabledChanged" liegt. Das müsstest du ggf. wo anders machen.

Der Code ist so natürlich noch nicht optimal, ich hab ihn nur kurz zusammengebastelt. :rolleyes:
 
Hi,

ich habe das Problem mit dem auf dem Control und nicht auf dem Panel zeichnen einfacher lösen können. Einfach vor CreateGraphics() den Namen des Panels schreiben.

Code:
Graphics grafik = anlageplan.CreateGraphics();

Aber irgendwie ist es nicht das was ich wollte. Ich wollte wie bei Paint so Linien ziehen. Weil jetzt können die Linien ja krumm sein, was ich eigentlich nicht wollte. Ich wollte eigentlich nur gerade Linien. Weis jemand wie das geht?

LG
 

Neue Beiträge

Zurück