Laden...

Probleme beim zeichnen, Bild erscheint nicht!?

Letzter Beitrag vor 16 Jahren 20 Posts 1.652 Views
Probleme beim zeichnen, Bild erscheint nicht!?

Hallo ! Ich habe mir die Beiträge rund ums Zeichnen angeschaut. Leider habe ich keine Lösung für mein Problem gefunden. Vielleicht kann mir jemand von Euch helfen. Es wird vermutlich nur ne Kleinigkeit sein, was mir fehlt damit meine Grafik auf meinem Display dargestellt wird!

Folgende Ausschnitt aus meinem Quelltext:

public void Rechteck(object sender,System.Windows.Forms.PaintEventArgs e)
        {
            Graphics af4 = e.Graphics;
            
            Pen GreenPen = new Pen(Color.Green);
            Pen RedPen = new Pen(Color.Red);
            Pen WhitePen = new Pen(Color.White);
            Pen YellowPen = new Pen(Color.Yellow);

            RedPen.Width = 3;
            GreenPen.Width = 3;
            YellowPen.Width = 3;

            af4.DrawRectangle(GreenPen, 103, 350, 20, 14);
            af4.DrawRectangle(YellowPen, 130, 350, 20, 14);
            af4.DrawRectangle(RedPen, 157, 350, 20, 14); 
        }

Die Funktion "Rechteck" rufe ich direkt am Anfang

 private void Form1_Load(object sender, EventArgs e)
       {
           Led(); 
           
        }

Dabei mekert mein Compiler "No overload for method 'Rechteck' takes '0' arguments"

Was muss ich ändern, damit es funktioniert ?

Gruss macke_a

Hallo,

also des sind Fehlermeldung wo ich mir denke, wie deutlich soll der Compiler denn noch werden, es steht doch unmissverständlich da was falsch ist. Nunja, in deinem Fall(mal angenommen mit der Led() meinst du deine Rechteck() Funktion und des ist nur nen Copy'n Paste Fehler) sagt dir der Compiler halt das es keine FUnktion Rechteck gibt die parameterlos ist, du hast ja auch nur eine mit 2 Parametern den sender und e - soll der Compiler raten was das sein soll, oder sich irgendwas ausdenken was er gerne hätte?

Selbst ohne diesen Fehler würde ein Zeichnen im Load keinen Sinn machen, schau dir mal dazu [Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox) an.

Baka wa shinanakya naoranai.

Mein XING Profil.

Hallo !
Anstatt Led() muss natürlich Rechteck() stehen im Form1_Load().

Wiederum habe ich meinen Quelltext in

 public Form1()
 {
     InitializeComponent();
     Rechteck();                       
 }

geändert. Soweit so gut ! Die Fehlerquelle bleibt natürlich erstmal bestehen. Ich übergebe meine Funktion "Rechteck()" keine Parameter. Die Funktion an sich habe ich auch noch verändert.

public void Rechteck(System.Windows.Forms.PaintEventArgs e)
 {
     Graphics af4 = e.Graphics;

      Pen GreenPen = new Pen(Color.Green);
      Pen RedPen = new Pen(Color.Red);
      Pen WhitePen = new Pen(Color.White);
      Pen YellowPen = new Pen(Color.Yellow);

      RedPen.Width = 3;
      GreenPen.Width = 3;
      YellowPen.Width = 3;

      af4.DrawRectangle(GreenPen, 103, 350, 20, 14);
      af4.DrawRectangle(YellowPen, 130, 350, 20, 14);
      af4.DrawRectangle(RedPen, 157, 350, 20, 14);
 }

Jetzt mal ne Frage, was erwartet denn dieser Teil
"System.Windows.Forms.PaintEventArgs e" ?

Ohne "System.Windows.Forms.PaintEventArgs e" bei meiner Funktion bin ich doch nicht in der Lage irgendwelche Grafiken zu zeichnen!

Was muss ich machen damit meine Funktion "funktioniert" ?

Mfg macke_a

Den Link in der ersten Antwort hab ich nicht zur Zierde gepostet, lies den, dann erübriget sich deine Frage.

Baka wa shinanakya naoranai.

Mein XING Profil.

Hallo !
Leider stehe ich immer noch auf dem Schlauch und ich komme einfach nicht weiter.... 😦

Nun, das liegt vermutlich daran, das ich erst seit 5Wochen mit C# programmiere und es an manchen Stellen einfach noch klemmt. Das ich zu faul bin mir die Sachen anzulesen, kann ich nicht bestätigen! Wie gesagt der "Aha so gehts - Effekt" ist noch nicht eingetreten.

Ich habe jetzt meinen Quelltext jetzt noch mal erweitert

public Form1()
{
     InitializeComponent();
     this.Paint += new System.Windows.Forms.PaintEventHandler(this.Rechteck);
}

public void Rechteck(System.Windows.Forms.PaintEventArgs e)
{
     Graphics af4 = e.Graphics;

      Pen GreenPen = new Pen(Color.Green);
      Pen RedPen = new Pen(Color.Red);
      Pen WhitePen = new Pen(Color.White);
      Pen YellowPen = new Pen(Color.Yellow);

      RedPen.Width = 3;
      GreenPen.Width = 3;
      YellowPen.Width = 3;

      af4.DrawRectangle(GreenPen, 103, 350, 20, 14);
      af4.DrawRectangle(YellowPen, 130, 350, 20, 14);
      af4.DrawRectangle(RedPen, 157, 350, 20, 14);
      
      invalidate();

}

Naja...wiederrum hat sich nichts meinem Formular verändert.

Aber ich will noch mal erleutern was ich machen möchte.

Ich zeichne drei Rechtecke, die einfach 3 LED´s darstellen sollen.
Sind die LED´s aus, stelle ich nur das Rechteck da.
Sobald die gelbe LED leuchten soll kommt der Quelltext, wie auch immer hinzu.

SolidBrush Yellw = new SolidBrush(Color.Yellow); 
af4.FillRectangle(Yellw , 130, 350, 20, 14);

Nun, gut es wäre echt nett, wenn mir jemand kurz unter die Arme greifen könnte, auch wenn mein Fragen vermutlich easy going für die meisten hier sind!

Die wichtigsten Fragen sind
a) Wie bekomme ich grundsätzlich die Rechtecke auf mein Formular bzw. was fehlt mir zu meinem Glück.
b) Wie kann ich von anderer Stelle aus meinen Programm am sinnvollsten die Rechtecke, mit Solid Brush auffüllen.

Vielen Dank für Eure Mithilfe im Voraus !

Mfg macke_a

PS: Hat jemand noch ein Verständnis Frage; ich bin den ganzen Tag online und werde dann natürlich auch umgehend antworten !

Hallo !
Leider stehe ich immer noch auf dem Schlauch und ich komme einfach nicht weiter.... 😦

Nun, das liegt vermutlich daran, das ich erst seit 5Wochen mit C# programmiere

Das hättest du nicht sagen brauchen. Man sieht das mehr aus deutlich 😉

Naja...wiederrum hat sich nichts meinem Formular verändert.

Aber ich will noch mal erleutern was ich machen möchte.

Du solltest dir lieber die Grundlagen aneignen. Das was du vorhast, ist nämlich pipifax!

Na das ist auch ne Antwort !

Leider bin ich bis jetzt immer noch nicht schlauer...
Vermutlich sehe ich den Wald vor lauter Bäume nicht..

Auch andere Beispiele bringen mich irgendwie nicht auf die richtige Lösung..

Sollte jemand mir noch helfen wollen bzw. mir kurz den Ansatz zeigen wie ich mein Quelltext richtig initialisieren muss, wäre ich dankbar...

Grundlagen hin oder her... jeder fängt klein an...oder auch mal mitten drin 🙂

Mfg macke_a

Schau dir den Code genau an.. So schwer ists ja eigtl nicht..
Das sollte nun aber reichen.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace LEDSample
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

    public class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.led1 = new LEDSample.LED();
            this.led2 = new LEDSample.LED();
            this.led3 = new LEDSample.LED();
            this.led4 = new LEDSample.LED();
            this.SuspendLayout();
            // 
            // led1
            // 
            this.led1.Location = new System.Drawing.Point(67, 23);
            this.led1.Name = "led1";
            this.led1.Size = new System.Drawing.Size(16, 16);
            this.led1.TabIndex = 0;
            // 
            // led2
            // 
            this.led2.LEDColor = System.Drawing.Color.Yellow;
            this.led2.Location = new System.Drawing.Point(168, 24);
            this.led2.Name = "led2";
            this.led2.Size = new System.Drawing.Size(16, 16);
            this.led2.TabIndex = 0;
            // 
            // led3
            // 
            this.led3.LEDColor = System.Drawing.SystemColors.ActiveCaption;
            this.led3.Location = new System.Drawing.Point(135, 23);
            this.led3.Name = "led3";
            this.led3.Size = new System.Drawing.Size(16, 16);
            this.led3.TabIndex = 0;
            // 
            // led4
            // 
            this.led4.LEDColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0)))));
            this.led4.Location = new System.Drawing.Point(102, 23);
            this.led4.Name = "led4";
            this.led4.Size = new System.Drawing.Size(16, 16);
            this.led4.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.led4);
            this.Controls.Add(this.led3);
            this.Controls.Add(this.led2);
            this.Controls.Add(this.led1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }

        #endregion

        private LED led1;
        private LED led2;
        private LED led3;
        private LED led4;
    }

    public class LED : UserControl
    {
        public LED()
        {
            InitializeComponent();
        }

        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // LED
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Name = "LED";
            this.Size = new System.Drawing.Size(16, 16);
            this.ResumeLayout(false);

        }

        #endregion

        private Color ledColor;

        [DefaultValue(typeof(Color), "Red")]
        public Color LEDColor
        {
            get { return this.ledColor; }
            set
            {
                this.ledColor = value;

                // Nach jeder Farbänderung neu zeichnen
                this.Invalidate();
            }
        }

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

            SolidBrush brush = new SolidBrush(this.LEDColor);
            e.Graphics.FillRectangle(brush, e.ClipRectangle);
            e.Graphics.DrawRectangle(SystemPens.ActiveBorder, e.ClipRectangle);
        }
    }
}

Hi !
Ich bekomme es immer noch nicht auf die Kette !
Das Problem muss woanders liegen...

public partial class Form1 : Form
{
     
    Pen BlackPen = new Pen(Color.Black,4);
    Pen GreenPen = new Pen(Color.Green, 3);
    Pen RedPen = new Pen(Color.Red, 3);
    Pen WhitePen = new Pen(Color.White);
    Pen YellowPen = new Pen(Color.Yellow, 3);

    public Form1()
    {
       InitializeComponent();

       this.Paint += new System.Windows.Forms.PaintEventHandler(Form1_Paint);
       this.Invalidate();
     }

     public void Form1_Paint(object sender, PaintEventArgs e)
     {
        Graphics af4 = e.Graphics;

        af4.DrawRectangle(GreenPen, 103, 350, 20, 14);
        af4.DrawRectangle(YellowPen, 130, 350, 20, 14);
        af4.DrawRectangle(RedPen, 157, 350, 20, 14);

     }

}


Das andere Programm habe ich auch schon ausprobiert, nix passiert.

Beim Debuggen habe ich das Problem das er die
public void Form1_Paint(object sender, PaintEventArgs e) { ... } nicht aufruft !

Was ist da los ???

Hi !
Ich bekomme es immer noch nicht auf die Kette !
Das Problem muss woanders liegen...

...
Das andere Programm habe ich auch schon ausprobiert, nix passiert.

Beim Debuggen habe ich das Problem das er die
public void Form1_Paint(object sender, PaintEventArgs e) { ... } nicht aufruft !

Was ist da los ???

Obiger Code funktioniert bei mir einwandfrei und auch beim Debuggen springt er in Form1_Paint rein. Hast Du das Fenster mal maximiert (einerseits um sicherzugehen, dass im sichtbaren Bereich gezeichnet wird, andererseits um definitiv ein Paint-Event auszuloesen) ?

Fenster mal maximiert

Wie soll ich das deuten? Was soll ich den maximieren ?
*** BIN NOCH NEULING ****

Fenster mal maximiert

Wie soll ich das deuten? Was soll ich den maximieren ?
*** BIN NOCH NEULING ****

C#-Neuling oder Windows-Neuling? 🤔

Die meisten Windows-Fenster haben oben rechts einen Button zum Schliessen und daneben auch einen zum Maximieren. Und wenn man darauf klickt (ole ole) maximiert sich das Fenster auf die volle Monitorgroesse. 8)

Achsooo.....
Diese Funktion ist bei mir deaktiv...ich nutze ein Vollbild ohne "maximizebox" !

Was nun, wenn der Paint Event nicht ausgelöst wird bei mir, bei Dir aber schon !?

Noch ne Idee..?

Achsooo.....
Diese Funktion ist bei mir deaktiv...ich nutze ein Vollbild ohne "maximizebox" !

Was nun, wenn der Paint Event nicht ausgelöst wird bei mir, bei Dir aber schon !?

Noch ne Idee..?

Das einfachste waere wahrscheinlich, Du machst mal ein Mini-Beispiel und haengst das einfach komplett als Zip-Datei hier an.

Rein vom Quellcode sehe ich absolut keinen Grund, warum der Event-Handler nicht aufgerufen wird.

Also Unglaublich !
Ich habe gerade mal ein neuen Dialog geöffnet !
Die selben Parameter :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Device
{
    public partial class Form1 : Form
    {
        Pen BlackPen = new Pen(Color.Black, 4);
        Pen GreenPen = new Pen(Color.Green, 3);
        Pen RedPen = new Pen(Color.Red, 3);
        Pen WhitePen = new Pen(Color.White);
        Pen YellowPen = new Pen(Color.Yellow, 3);

        public Form1()
        {
            InitializeComponent();
            this.Paint += new System.Windows.Forms.PaintEventHandler(Form1_Paint);
            this.Invalidate();

        }

        public void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics af4 = e.Graphics;

            af4.DrawRectangle(GreenPen, 103, 350, 20, 14);
            af4.DrawRectangle(YellowPen, 130, 350, 20, 14);
            af4.DrawRectangle(RedPen, 157, 350, 20, 14);

        }


        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

Und da funktioniert das System....
Der einzigste Unterschied, ist das die Properties der Form anders sind!

Unglaublich........
Woran mag das denn wohl liegen?? Ne Idee ?

Und da funktioniert das System....
Der einzigste Unterschied, ist das die Properties der Form anders sind!

Das ist doch schon mal ein Fortschritt 🙂

Unglaublich........
Woran mag das denn wohl liegen?? Ne Idee ?

Dazu muss man ja eigentlich nur mal untersuchen, welche Properties unterschiedlich gesetzt sind. Um das zu sehen, waere mal interessant den Code aus "InitializeComponent" zu sehen.

Problem gelöst..!

Der letzte Quellcode funktioniert jetzt..!
Noch mal was anderes zu dem Thema, wenn ich jetzt das Dreieck was grün ist, nachträglich irgendwann in meinem Programm gelb habe möchte, wie mache ich das am besten ?

Wie kann ich am saubersten programmieren `?

Problem gelöst..!

Der letzte Quellcode funktioniert jetzt..!

Schoen waere jetzt natuerlich zu erfahren, WIE das Problem geloest wurde bzw. woran es letztendlich gelegen hat. Einfach um fuer zukuenftige Probleme dieser Art Anhaltspunkte zu haben.

Noch mal was anderes zu dem Thema, wenn ich jetzt das Dreieck was grün ist, nachträglich irgendwann in meinem Programm gelb habe möchte, wie mache ich das am besten ?

Wie kann ich am saubersten programmieren `?

Einfach eine Property fuer die Farbe definieren.


Pen farbeZustandX = new Pen(Color.Green, 3);

public Color farbeX
{
      get 
      {
            return farbeZustandX.Color;
       }
       set 
       {
            farbeZustandX = new Pen(value, 3);
       }
 }

Intern arbeitest Du mit dem Pen-Objekt, bei der Property interessiert allerdings nur die Farbe, also ein Color-Objekt.
Das ist IMHO die sauberste Loesung, da fuer dem Benutzer der Klasse gar nicht beachtet werden muss, ob intern ein Pen (fuer DrawRectangle) oder Brush(fuer FillRectangle) verwendet wird. Es interessiert nur die Farbe. Man koennte natuerlich auch die Farbe in einem Color-Objekt speichern, muesste dann aber in jedem Paint-Event ein neues Pen- bzw. Brush-Objekt erzeugen, was fuer gewaltigen Overhead sorgt.

Mein Fehler war das ich in meinem Quelltext diese beiden Routinen hatte.

1.
protected override void OnPaint(PaintEventArgs e)
{....}

2.
private void Form1_Paint(object sender, PaintEventArgs e)
{...}

Er hat bevorzugt die erste Routine "automatisch" angesprungen und die zweite ist dann nicht mehr aufgerufen worden!.
Ich habe dann die erste auskommentiert und danach hat er die zweite angesprungen!
Das war mein Fehler

Dumm gelaufen, aber daran hat es im Endeffekt gelegen.
Aber besten Dank für Dein Engagement

Die Sache mit den Properties ist gut, damit werde ich jetzt fortfahren....

Schönen Dank noch mal...