Announcement

Collapse
No announcement yet.

Farbverlauf in Panel anzeigen

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

  • Farbverlauf in Panel anzeigen

    Hallo zusammen!

    Ich hab eine Form erstellt, ín der ich 2 Farben mit trackBars definieren kann.
    die beiden Farben sind in Feldern "System.Drawing.Color color1 bzw color2" abgelegt. In einem Panel, würde ich gerne einen Farbverlauf aus den beiden Farben anzeigen lassen. Kann mir dabei bitte jemand helfen?
    Vielen Dank schon mal für die Antworten!

  • #2
    So aus dem Bauch: Den OnPaint-Event des Panels auf folgende Methode zeigen lassen:

    Code:
       private void panel_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {
          Rectangle rect = new Rectangle(new Point(0,0) , ((Panel)sender).Size); 
          LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Yellow, Color.Green,0.0F);
          e.Graphics.FillRectangle(brush, rect);
        }
    Gruß
    Peter

    Comment


    • #3
      In welchem namespace liegt LinearGradientBrush? Bekomm da nämlich ne Meldung zu ner fehlenden using direktive...

      Passt, habs schon...

      Hm so ansich hat das schon funktioniert, wenn ich aber an "LinearGradientBrush" statt Color.Yellow usw. meine Felder übergebe, werden die Farben nicht angezeigt...
      Zuletzt editiert von brown78; 12.10.2008, 19:50.

      Comment


      • #4
        Hallo,

        das Rechteck in dem gezeichnet werden soll kann auch über das Argument im Paint-Ereignis abgerufen werden.
        [highlight=c#]
        Rectangle rect = e.ClipRectangle;
        [/highlight]

        In welchem namespace liegt LinearGradientBrush?
        Tipp: Schreibe einfach die Methode in Visual Studio und dann erscheint wenn der Namespace noch nicht eingebunden ist ein kleiner roter Balken (siehe Abbildung). Da kann mit der Maus hingefahren werden und im Menü der Namespace ausgewählt werden. Das ganze geht auch beim Erscheinen des Balkens mit Alt + Shift + F10.

        mfG Gü
        Attached Files
        Zuletzt editiert von gfoidl; 12.10.2008, 21:37. Reason: Anhang hinzugefügt
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hallo,

          Beispiel:
          [highlight=c#]
          using System.Drawing;
          using System.Drawing.Drawing2D;
          using System.Windows.Forms;

          namespace WindowsFormsApplication1
          {
          public partial class Form1 : Form
          {
          private Color _color1 = Color.RoyalBlue;
          private Color _color2 = Color.Red;

          public Form1()
          {
          InitializeComponent();
          }

          private void panel1_Paint(object sender, PaintEventArgs e)
          {
          LinearGradientBrush brush = new LinearGradientBrush(
          e.ClipRectangle,
          _color1,
          _color2,
          LinearGradientMode.Horizontal);

          e.Graphics.FillRectangle(brush, e.ClipRectangle);
          }

          private void button1_Click(object sender, System.EventArgs e)
          {
          if (colorDialog1.ShowDialog() == DialogResult.OK)
          {
          _color1 = colorDialog1.Color;
          panel1.Refresh();
          }
          }

          private void button2_Click(object sender, System.EventArgs e)
          {
          if (colorDialog1.ShowDialog() == DialogResult.OK)
          {
          _color2 = colorDialog1.Color;
          panel1.Refresh();
          }
          }
          }
          }
          [/highlight]

          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment


          • #6
            Also, @ gfoidl, wenn ich Deinen Code so verwende, bzw. die panel.Refresh() Methode, dann wird ein Auswahlfenster gar nicht angezeigt, das Panel flackert....

            Ums etwas detailierter dar zu stellen, ich verwende 3 Trackbars, die RGB Werte liefern und diese in int variablen speichern, je eine für die 3 RGB Farben für Start- und Endfarbe...

            urpsünglich waren zwei Panels in der Form, in die über eine showColor() Methode die 3 int Variablen in ein neues Objekt von Typ Color gepackt wurden (Color.FromArgb) - was dann die Felder color1 und color2 ergab...

            Comment


            • #7
              Ich poste hier mal den gesammten Code:
              Code:
              {
              
              publicpartialclassColorForm : Form
              {
              //Klassenvariablen für RGB Argumente erstellen
              publicstaticint redValueS = 128, greenValueS = 128, blueValueS = 128;
              publicstaticint redValueE = 128, greenValueE = 128, blueValueE = 128;
              publicColor color1 = Color.FromArgb(redValueS, greenValueS, blueValueS);
              publicColor color2 = Color.FromArgb(redValueE, greenValueE, blueValueE);
              
              public ColorForm()
              {
              InitializeComponent();
              }
              
              // Rot-Anteil einstellen
              privatevoid trkRed_Scroll(object sender, EventArgs e)
              {
              redValueS = trkRed.Value;
              }
              
              // Grün-Anteil einstellen
              privatevoid trkGreen_Scroll(object sender, EventArgs e)
              {
              greenValueS = trkGreen.Value;
               }
              
              // Blau-Anteil einstellen
              privatevoid trkBlue_Scroll(object sender, EventArgs e)
              {
              blueValueS = trkBlue.Value;
               }
               
              privatevoid pnlColorSample_Paint(object sender, PaintEventArgs e)
              {
              Rectangle rect = newRectangle(newPoint(0,0) , ((Panel)sender).Size); 
              LinearGradientBrush brush = newLinearGradientBrush(rect, color1, color2, LinearGradientMode.Horizontal);
              e.Graphics.FillRectangle(brush, rect);
              }
              
              privatevoid button1_Click(object sender, EventArgs e)
              {
                Close();
              }
              
              // Standartposition der Regler setzen
              
              privatevoid ColorForm_Load(object sender, EventArgs e)
              {
              trkRed.Value = trkRedE.Value = redValueS;
              trkGreen.Value = trkGreenE.Value = greenValueS;
              trkBlue.Value = trkBlueE.Value = blueValueS;
              }
              
              // Rot-Anteil Endfarbe einstellen
              
              privatevoid trkRedE_Scroll(object sender, EventArgs e)
              {
              redValueE = trkRedE.Value;
               }
              
              
              // Grün-Anteil Endfarbe einstellen
              
              privatevoid trkGreenE_Scroll(object sender, EventArgs e)
              {
              greenValueE = trkGreenE.Value;
              }
              
              // Blau-Anteil Endfarbe einstellen
              
              privatevoid trkBlueE_Scroll(object sender, EventArgs e)
              {
              blueValueE = trkBlueE.Value;
              }
              }
              }

              Comment


              • #8
                So wie der Code oben ist, wird die Form korrekt angezeigt, jedoch die Farbänderung nicht. Das Panel behält die Standart Farbe (128, 128, 128)...

                Die RGB Werte brauche ich, da diese die Start und Endfarbe einer Progressbar definieren (die ProgressBar hab ich von CodeProject.com übernommen)...
                Zuletzt editiert von brown78; 12.10.2008, 20:53.

                Comment


                • #9
                  Also, @ gfoidl, wenn ich Deinen Code so verwende, bzw. die panel.Refresh() Methode, dann wird ein Auswahlfenster gar nicht angezeigt, das Panel flackert....
                  Da flackert gar nichts...

                  Wie sollen deine Farben geändert werden wenn ihnen kein neuer Wert zugewiesen wird?

                  mfG Gü
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment


                  • #10
                    Leider doch, in der Form sind zwei GroupBoxen, mit den drei trackbars, die rechte davon war nicht mehr zu sehen, nur noch der rand und das Panel war vertikal in weiß und grau geteilt...
                    Achso, das leigt viellceicht daran, dass ich .Refresh in die Panel.Paint Methode geschrieben hatte...

                    Ich hab nur einen "Ok" Button, der die Form wieder schließt. Die Farben sollen ja direkt beim verschieben der Farbregler angezeigt werden. Wie kann ich das umstezen?

                    Comment


                    • #11
                      Das hat aber nichts mit meinem Code zu tun, sondern mit deinem
                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                      Comment


                      • #12
                        Ja, das kann gut sein :-)
                        Ich wollt Dich ja nicht beleidigen, so weit ich das einschätzen kann beherrschst Du die Materie schon....
                        Ich probier noch ein paar Sachen aus, vllt krieg ich das ja dann hin...

                        Comment


                        • #13
                          Hab ich auch nicht so aufgefasst.
                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                          Comment


                          • #14
                            Na dann bin ich beruhigt... aber back to topic...
                            Ich hab mich jetzt nochmal an dem Code mit 2 Panels orientiert, da die Methoden der TrackBars ja void sind, ruft jede Trackbar, nachdem der jeweilige Farbwert mit dem Value gesetzt wird, die Methode showColor auf, die dann mit Color color1 = Color.FromArgb(usw,usw,usw) eine Farbe erstellt und im Panel anzeigt.

                            Also hab ich jetzt wieder ne Methode showColor eingebaut, die halt color1 und color2 erstellt. Der Farbverlauf wird in dem Panel jetzt angezeigt, aber erst, nachdem ich die Form schließe und wieder öffne...

                            Comment


                            • #15
                              Hallo,

                              im Anhang ein Bsp.

                              Wenn in jedem Scroll-Event das Panel neu gezeichnet tritt Flackern auf.
                              Vielleicht gibt es eine Lösung dies mit Double-Bufferung zu lösen - bekomme ich im Moment nicht hin.

                              Das Projekt im Anhang löst das so:
                              Ein Timer aktualisiert das Panel. Beim Scrollen wird der Timer gesetzt. Somit tritt die Änderung zeitverzögert auf (200ms) und Flackern ist nicht sichtbar.

                              mfG Gü
                              Attached Files
                              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                              Comment

                              Working...
                              X