Announcement

Collapse
No announcement yet.

Farbverlauf in Panel anzeigen

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

  • #16
    Ok, danke erstmal dafür, aber des muss doch auch anders gehen, oder? Wenn ich nämlich an LinearGradient als Argumente nicht meine Farben sonder bspw. Color.Yellow und Color.Blue übergebe, dann wird das doch auch angezeigt...

    Comment


    • #17
      Wenn ich nämlich an LinearGradient als Argumente nicht meine Farben sonder bspw. Color.Yellow und Color.Blue übergebe, dann wird das doch auch angezeigt...
      das geht auch. Bei deinem Code - den du vorher mal gepostet hast - fehlt nur dass den Farbwerten nach Änderung der Scroll-Position die Werte zugewiesen werden.
      Der LinearGradientBrush verwendet deshalb immer die gleichen ungeänderten Werte.

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

      Comment


      • #18
        Ach und wie weise ich denen die Werte zu?

        Übrigens Dein Beispiel funzt, aber nur wenn ich es direkt verwende, hab meinen Code so umgeschrieben und es geht nicht mehr...

        Jetzt brauch ich nur noch 2 Felder, die "Color.FromArgb(die Werte der Scrollbars)" aufnehmen, damit ich diese Farben dann in meiner ProgressBar verwenden kann....
        (Die ProgressBar hatte übrigens zu jeder Zeit die richtigen Farben übernommen)

        Stop! Es geht, ich hatte den Timer_Tick event von Dir einfach kopiert und eingefügt, das geht natürlich nicht.... Ein Doppelklick auf den Timer, und den Code verschoben und TaDa!

        So jetzt brauch ich nur noch die Felder.... Na mal sehen....
        Zuletzt editiert von brown78; 13.10.2008, 17:07.

        Comment


        • #19
          Ach und wie weise ich denen die Werte zu?
          Variable = Wert;

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

          Comment


          • #20
            Ja also, ich dachte das würde ich machen in dem ich color1 = Color.FromArgb(redValue usw) als Feld initialisiere... Wobei im trkRed_Scroll event dann trkRed.Value = redValue;
            steht...

            Oh man, natürlich geht das so, aber nur wenn man die Assoziativität beachtet... mit
            "redValue = trkRed.Value" geht das auch....

            So, alles klar, das funktioniert jetzt so, wie ich mir das gedacht hab. Ohne den Timer funktioniert es nicht... Naja, kostet ja kein Geld so ein Timer

            Ich danke Dir erneut recht herzlich! (Bis bald denk ich)
            Zuletzt editiert von brown78; 13.10.2008, 17:38.

            Comment


            • #21
              Ich spreche vom Code der hier gepostet ist: http://entwickler-forum.de/showpost....97&postcount=7

              Wie du selbst richtig geschrieben hast
              color1 = Color.FromArgb(redValue usw) als Feld initialisiere
              initialisiere -> passiert nur wenn eine Instanz der Form erstellt wird. Sonst passiert gar nichts mehr.

              Die muss immer passieren wenn der Farbwert benötigt wird - wie im Beispielprojekt gezeigt.

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

              Comment


              • #22
                Noch eine kleine Frage zum Schluß: Welche Vorgehensweise findest Du besser und sauberer?
                Ich möchte den Trackbars, beim öffnen der Form als Standart den Mittelwert (128) geben.
                Da hab ich jetzt 2 Möglichkeiten entdeckt.

                1. Die Felder, für die TrackBar.Values, die ich eh schon habe, mit dem Wert 128 zu initialisiern und in ColorForm_Load(), die TrackBar.Values mit den Feldern gleichsetzen. Das sieht dann quasi so aus:

                public static int red1 = 128, green1 = 128, blue1 = 128;

                private void ColorForm_Load()
                {
                trbRed.Value = red1;
                ...
                ...
                }

                2. Die Felder nicht mit dem Mittelwert initialisieren dafür in

                private void ColorForm_Load()
                {
                trkRed.Value = 128;
                ...
                ...
                }

                Comment


                • #23
                  Originally posted by gfoidl View Post
                  Ich spreche vom Code der hier gepostet ist: http://entwickler-forum.de/showpost....97&postcount=7

                  Wie du selbst richtig geschrieben hast
                  initialisiere -> passiert nur wenn eine Instanz der Form erstellt wird. Sonst passiert gar nichts mehr.

                  Die muss immer passieren wenn der Farbwert benötigt wird - wie im Beispielprojekt gezeigt.

                  mfG Gü

                  Hups, ich meinte nicht "initalisiet", im Sinne von... naja was es halt in C# eigentlich bedeudet... ähm deklarieren meinte ich...
                  Hab glaub ich öfter schon initialisieren gesagt, wo's gar nicht richtig ist...

                  Ich hab eigentlich nur den Fehler gemacht, dass ich color1 und color2 als Felder deklariert hab, und nicht in der Methode panel_Paint definiert, oder? Naja und der fehlende Timer halt....

                  Comment


                  • #24
                    Originally posted by gfoidl View Post
                    Vielleicht gibt es eine Lösung dies mit Double-Bufferung zu lösen - bekomme ich im Moment nicht hin.
                    Der Trick ist ein

                    Code:
                    base.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
                    im Construktor deiner abgeleiteten Panel Klasse.

                    Comment


                    • #25
                      Abgeleitete Panel Klasse? Hab ich die

                      Comment


                      • #26
                        Sorry brown78 wollte dich nicht verwirren. Nein da du fragst du hast vermutlich noch kein abgeleitetes Panel
                        Das ging an gfoidl . Dachte in seinem Beispiel an dich hätte er ein abgeleitetes Panel benutzt.(Ich hätte es mir ansehen sollen)

                        Um das Flickern zu vermeiden(ohne einen Timer zu bemühen) müssen die ControlStyles des Panels richtig gesetzt werden. Da die Methode dazu(SetStyle) aber protected ist muß man das Panel wie folgt ableiten um die Methode aufrufen zu können.

                        Code:
                            public partial class MyPanel : Panel
                            {
                                public MyPanel() : base()
                                {
                                    base.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
                                }
                            }
                        Danach kannst du aus den ScrollEvents der Trackbars direkt ein Panel.Refresh() aufrufen und die Timer wegwerfen.

                        Comment


                        • #27
                          Aha, und der Vorteil davon ist, das das Flackern (tritt alle 20sek mal kurz auf), verschwindet?

                          dann muss ich die Panel_Paint() Methode auch in MyPanel_Paint ableiten, und in die Klasse schreiben?

                          Übrigens Brown genügt... :-)

                          Comment


                          • #28
                            Ich hab das jetzt mal so versucht: Mein jetziges Panel heist "pnlColorSample". Mit obigem Code habe ich MyPanel von Panel abgeleitet und nach den DoubleBuffering Code mit:

                            MyPanel pnlColorSample = new MyPanel();

                            versucht das hinzubekommen. Ging aber nicht, es flackert noch mehr, beim ziehen der Regler...

                            Comment


                            • #29
                              @Ralf: Danke für den Tip.

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

                              Comment


                              • #30
                                DoubleBufferung:

                                Zitat MSDN:
                                Damit die Doppelpufferung vollständig aktiviert wird, können Sie auch die Bits OptimizedDoubleBuffer und AllPaintingInWmPaint auf true festlegen. Das bevorzugte Verfahren zum Aktivieren der Doppelpufferung mit gleichem Ergebnis besteht jedoch darin, die DoubleBuffered-Eigenschaft für das Steuerelement auf true festzulegen.
                                Was ist dann der Unterschied zwischen OptimizedDoubleBuffer und DoubleBuffer. Beide gibt es in der Enumeration die in SetStyle verwendet wird?


                                brown-Problem:
                                Im Anhang das aktualisierte Projekt. Die Standardwerte hab ich den TrackBars im Designer gegeben -> werden beim Paint-Ereignis immer eingelesen, so auch beim 1. Starten.

                                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