Announcement

Collapse
No announcement yet.

Panel nach minimieren neu zeichnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Panel nach minimieren neu zeichnen

    Hallo Leutz!

    Wenn ich meine Form einmal minimiere und wieder maximiere, dann sind alle gezeichneten Objekte auf meinem Panel verschwunden. So weit so gut. In meinem Schlauen Büchlein steht, das ich das Ereignis Paint benutzen soll um den Inhalt im Panel neu zu zeichnen.

    Hier werden die Objekte zuerst in das Panel gezeichnet dies funktioniert auch
    Code:
    private void button1_Click(object sender, EventArgs e)
            {
                // Objekte und Vareblen für das Zeichnen initialisieren
                System.Drawing.Graphics grpObject;
                grpObject = panel1.CreateGraphics();
                Punkt PanelendPunkt = new Punkt(panel1.Size.Width, panel1.Size.Height);
                        
                // Pad Außenkanten zeichnen
                Inhalt.zeinchnen(PanelendPunkt, grpObject);
                        
                // Dispenspunkte Zeichen
                Inhalt.dispZeichnen(PanelendPunkt, grpObject);
            }
    Wenn ich jetzt zusätzlich noch den Coode in das Paint ereignis schreibe passiert garnix mehr nocht mal mehr wenn ich auf button1 clicke.
    Code:
    private void panel1_Paint(object sender, PaintEventArgs e)
            {
                // Objekte und Vareblen für das Zeichnen initialisieren
                System.Drawing.Graphics grpObject;
                grpObject = panel1.CreateGraphics();
                Punkt PanelendPunkt = new Punkt(panel1.Size.Width, panel1.Size.Height);
    
                // Pad Außenkanten zeichnen
                Inhalt.zeinchnen(PanelendPunkt, grpObject);
    
                //// Dispenspunkte Zeichen
                //Inhalt.dispZeichnen(PanelendPunkt, grpObject);
            }

  • #2
    Regel für die Fensterprogrammierung:

    Ein Fenster muss stets wissen, wie es sich darstellen muss. Wenn du nur Standardkomponenten nimmst und diese nicht selbst erzeugst, sondern die Verwaltung dem System überlässt, "weiss" das System wie das Fenster aussehen soll.

    Wenn du zur Laufzeit bsp. in ein Fenster zeichnest , muss du das anzeigen der Zeichnung im OnPaint realisieren.

    Das erzeugen des panel1 und das anlegen des Graphickontext gehört nicht in die OnPaint. Dieses soll ja nur einmal erzeugt werden und dann immer auf diesem gezeichnet werden. Diese sollten bei der Initialisierung angelegt werden. Im OnPaint wird dann nur immer das Gezeichnete dargestellt; hier die Zeichnung der Punke.
    Christian

    Comment


    • #3
      Wenn ich jetzt zusätzlich noch den Coode in das Paint ereignis schreibe passiert garnix mehr nocht mal mehr wenn ich auf button1 clicke.
      Richtig wäre den Code zum zeichnen nur aus dem Paint Ereignis auszuführen. Dort solltest du kein neues Graphics erzeugen sondern das Benutzen das du in den EventArgs (e.Graphics) übergeben bekommst.

      Im Button.Click Event nichts zeichnen sondern panel1.Invalidate() aufrufen. Heißt man erklärt die Oberfläche des Panels für ungültig wodurch das Panel weiß es sich selbst neu zeichnen wobei es dann seinen Paint Event aufruft. Das ist bei Winforms Best Practice.

      Wenn das dann immer noch nicht funktioniert. Debugge deinen Paint EventHandler ob der den beim maximieren aufgerufen wird. Das sollte im Normalfall passieren. Wenn der bei dir nicht aufgerufen wird brauchen wir ein paar mehr Contextinformationen zum Beispiel wie du das Panel eingestellt/verstellt hast.

      Comment


      • #4
        mit der Erläuterung von Ralf komm ich nicht soo ganz klar. ich hab den coode jetzt mal so geschrieben wie ich ihn verstanden habe, natülich klappt nichts.

        Code:
        private void button1_Click(object sender, EventArgs e)
                {
                            // Objekte und Vareblen für das Zeichnen initialisieren
                            System.Drawing.Graphics grpObject;
                            grpObject = panel1.CreateGraphics();
                            Punkt PanelendPunkt = new Punkt(panel1.Size.Width, panel1.Size.Height);
        
                            panel1.Invalidate();
                }
        
        private void panel1_Paint(object sender, PaintEventArgs e)
                {
                    Punkt PanelendPunkt = new Punkt(panel1.Size.Width, panel1.Size.Height);
        
                    // Pad Außenkanten zeichnen
                    Inhalt.zeinchnen(PanelendPunkt, e.Graphics);
        
                    //// Dispenspunkte Zeichen
                    Inhalt.dispZeichnen(PanelendPunkt, e.Graphics);
                }
        mit e.Graphics wird mein grpObject nicht übergeben.

        Contextinformationen? Die Form und das Panel habe ich mit Visoal Studio 2010 und derem Disigner erstellt.

        Comment


        • #5
          [Highlight=C#]private void button1_Click(object sender, EventArgs e)
          {
          panel1.Invalidate();
          }[/Highlight]

          Alles andere ist wie gesagt überflüssig oder gehört in den Paint Event.

          mit e.Graphics wird mein grpObject nicht übergeben.
          Das brauchst du nicht du hast schon das in e.Graphics das reicht und das solltest du ausschließlich benutzen. Der Inhalt deines Paint Events sieht jetzt ok aus(ohne den Inhalt deiner aufgerufen Methoden zu kennen bzw. beurteilen zu können)

          Hast du überprüft ob dein Paint Event aufgerufen wird?

          Comment


          • #6
            hat in button1_Click nichts zu suchen:
            Code:
            // Objekte und Vareblen für das Zeichnen initialisieren 
            System.Drawing.Graphics grpObject; 
            grpObject = panel1.CreateGraphics(); 
            Punkt PanelendPunkt = new Punkt(panel1.Size.Width, panel1.Size.Height);
            Code:
            Inhalt.zeinchnen(PanelendPunkt, e.Graphics);  
            Inhalt.dispZeichnen(PanelendPunkt, e.Graphics)
            Was ist "Inhalt", was macht "zeinchnen", was macht "dispZeichnen"?
            Günther

            Comment


            • #7
              Das Pain ereignis wird auf jedenfall erreicht.

              Das Problem was ich habe ist, wenn ich was in das Paintereignis schreibe zb. inhalt.zeichnen() dann funktioniert gar nix mehr. noch nicht einmal wenn ich meinen alten coode mit einem button click aus löse. es wird einfach nichts mehr in das panel gezeichnet.

              zur kurzen erläuterung meiner Funktionen:
              Inhalt ist eine Klasse in der meine Methoden zeichnen und dispzeichenen enthalten sind.
              im grunde funktioniert zeichnen so:
              Code:
              public void zeinchnen(Punkt zeichenfeldEndPunkt, System.Drawing.Graphics Zeichenfeld)
              {
                     Pen Stift = new Pen(System.Drawing.Color.Blue);
                     schleife
                     {
                           // Daten aus der Liste holen
                           // einige Rechnungen durführen
                           Zeichenfeld.DrawLine(Stift, Linienmaße);
                     }
              }

              Comment


              • #8
                Du willst ja nicht in e.Graphics zeichnen, sondern in den hoffentlich vorher einmalig als Member angelegten grpObject des Panels
                Christian

                Comment


                • #9
                  Multipliziere die y-Werte der Punkte einmal mit -1.
                  Günther

                  Comment


                  • #10
                    Wüsste nicht was mal -1 bringen sollte an sich funktioniert der coode ja nur nicht mit Paint ereignis

                    Comment


                    • #11
                      Wüsste nicht was mal -1 bringen
                      Dein PanelendPunkt liegt außerhalb des Zeichenbereichs wenn du denn so zum Zeichnen benutzt. Der gültige Bereich geht von 0 bis Width-1 bzw. 0 bis Height-1.

                      Mit den Teilen die du bisher zeigst können wir leider so nicht weiterhelfen. Entweder du kannst deine Anwendung auf das minimale (aber lauffähige) reduzieren und hier anhängen damit wir uns das genauer ansehen können oder du versuchst es nochmal von 0 an zusammenzusetzen solange bis es nicht mehr läuft. Dann solltest du das Problem selbst erkennen.

                      Comment


                      • #12
                        So nun hab ich es raus gefunden.
                        Das Problem war, dass erst nach dem Öffnen einer Datei, wo die unter anderem ganzen Koordinaten stehen, die Zeichnen Methode ausgefürt werden kann. Das Paint ereigniss tritt aber schon bevor ich eine Datei per Öffnen Dialog öffne ein und stürtzt an scheinen was ab.

                        Jetzt habe ich einfach in das Paint ereigniss eine Bedingung geschrieben, dass die zeichnen Methode nur auf gerufen werden darf wenn schon eine Datei geöffnet wurde. Jetzt funtzt es!

                        Danke euch!

                        Comment

                        Working...
                        X