Announcement

Collapse
No announcement yet.

OnPaint nur mit Ableitung aus UserControl, nicht mit Textbox

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

  • OnPaint nur mit Ableitung aus UserControl, nicht mit Textbox

    Servus,

    Warum funzt das OnPaint Event nur mit Ableitung aus Usercontrol, und nicht bei Ableitung aus Textbox?
    Es gibt keinen Error oder so, es passiert nur einfach nichts.

    Ich bin jetzt ne ganze Weile dabei mich mit dem Zeugs zu marten, hab dazu dieses Beispiel genommen.
    http://entwickler-forum.de/archive/i...p/t-70135.html

    Ob ich von Usercontrol ableite oder von Textbox muss doch egal sein, Event ist Event, wenn es das Paint-Event nicht gäbe, könnt ich es doch nicht deklarieren, oder was weiss ich hier nicht?


    Code:
    public class MyTextBox : TextBox
        {
            bool down = false;
            //private TextBox textbox = new TextBox();
            private Color _borderColor;
            private Color _BackColor;
            public MyTextBox()
            {
                this.Paint += new PaintEventHandler(this.OnPaint);
                this.Resize += new EventHandler(this.OnResize);           
    
                this.Height  += 200;
                this.Width +=  2;
                //this.Location = new Point(20, 55);
    
                this.BorderColor = System.Drawing.SystemColors.Window;
                this.BackColor = Color.White;
    
                //this.Controls.Add(this);
    
                //this.textbox.Click += new EventHandler(this.OnClick);
    
                this.KeyPress += TextBoxKeyPress;
            }
    
            public override Color BackColor
            {
                get { return this._BackColor; }
                set { this._BackColor = value; }
            }
    
            public Color BorderColor
            {
                get { return this._borderColor; }
                set
                {
                    this._borderColor = value;
                    this.Refresh();
                }
            }
    
            protected virtual void OnResize(object sender, EventArgs e)
            {
                this.Size = new Size(this.Width, this.Height);
                this.Location = new Point(1, 1);
            }
    
            protected virtual void OnPaint(object sender, PaintEventArgs e)
            {
    
                ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, _borderColor, ButtonBorderStyle.Solid);
                //ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, ((MyTextBox)sender)._BackColor, ButtonBorderStyle.Solid);
            }
    
            protected virtual void TextBoxKeyPress(object sender, KeyPressEventArgs e)
            { /*nop*/ }
    
            protected override void OnKeyDown(KeyEventArgs e)
            {
                if (!down)
                    base.OnKeyDown(e);
                else
                    e.SuppressKeyPress = true;
                down = true;
            }
            protected override void OnKeyUp(KeyEventArgs e)
            {
                base.OnKeyUp(e);
                down = false;
            }
        }

  • #2
    Weil die Textbox ein Common Control von Windows ist. Die gehört zu Windows, wird von Windows gezeichnet und die .Net Klasse ist nur ein schmaller Wrapper um das Common Control herum. Da also .Net nichts zeichnet ist der Event auch überflüssig da nicht verwendet.

    Der Event kommt aber vom BasisControl in Winforms wodurch alle Controls den haben also auch die TextBox auch wenn die damit nix anfangen kann. Microsoft hat immerhin versucht den Event zu verstecken. Du solltest dich also gewundert haben das du den im Designer oder bei der Codevervollständigung nicht angeboten bekommst. Und jetzt der wichtigste Punkt der dir aufgefallen sein sollte. Es ist in der Dokumentation so beschrieben das der Event nix tut . Ich zitiere "This event is not relevant for this class."

    Comment


    • #3
      Na gut, dann solls halt so sein, ich danke erst mal dafür.

      Weil eben in der Dokumentation steht "This event is not relevant for this class.", geh ich ihr gerne aus dem Weg, sieht geht zuwenig auf Zusammenhänge ein
      Ob das Event was macht hängt doch davon ab wie ich es einbaue? Wahrscheinlich stimmt das nicht nur lässt sich das eben nicht aus der Dok ziehen.

      Ich hab vor das Paintereignis zu verwenden, um z.B. Backkolor für weitere Textboxen zu überschreiben.
      Und dabei ergibt sich gleich nochwas, weswegen ich die Dokumenation manchmal eindampfen möchte.
      Weil es so viele gibt worauf sie nicht eingeht. Hier ein Beispiel eine Klasse mit einem Event das ich auskommentieren kann und trotzdem wird sich das Teil genauso ausführen lassen wie vorher, also auch unterscheiden von welchem 'Sender' das Event aufgerufen wird.
      http://msdn.microsoft.com/de-de/libr...=vs.90%29.aspx

      Wenn ich in der Textboxklasse(wie hier gepostet) die OnPaint Methode nicht überschreibe, ghet zwar alles fehlerfrei durch, aber der Sender ist dann jedesmal MyTextbox, nicht MyIntBox, so wie erwartet.
      Dasselbe hätte ich nun auch in dem Beispiel wie unter dem Link erwartet.
      Zuletzt editiert von bjoernbw; 13.12.2013, 20:28. Reason: anschluss Frage, Link eingefügt

      Comment


      • #4
        zu schwierig?

        Die letzte normale Konversation in einem IT_Forum hatte ich vo ein paar Jahren, da war ich im Ausland,
        hab von dort einen Account angelegt, hat für drei Antworten gereicht.
        Dann wusste man wieder wer 'das' ist. Das heisst,
        danach hatte ich dann wieder per se die OberGurus auf dem Hals, nur die.
        Die aber nur belehrende, mahnende Antworten geben.

        Solche IT-Foren sind wie ein Forecast, auf die Welt von morgen,
        falls die Überwachungsflut nicht eingedämmt wird.
        Denn die geschlossene Antwortverweigerung, betrifft nicht nur dieses Forum,
        es ist übergreifend.

        Ich kenn von diesen Typen keinen persönlich, nie einem begegnet.
        Umgekehrt kann es aber sein, dass sie von mir mehr wissen als mir lieb ist.
        Und es ist ihnen unerträglich, dass der da..., soll nicht sein, ... darf nicht sein.

        Denn, dass alle IT-Foren-User, geschlossen einer Meinung sind, bezüglich:
        'der da' war nicht artig, - ist unmöglich, findet aber statt.


        Würden ab Morgen, alle User sich nur noch via Anonymisierungssoftware einloggen,
        würde diese Sorte von Mods 'Gurus'
        verschwinden, dann gäbe es wieder andere.

        Comment


        • #5
          Ich bin hier User so wie du, freiwillig hier und nicht mal anonym. Wenn dir irgendwas nicht passt verschwurbele es nicht in einer weise die kaum zu verstehen ist. Sondern sprich es klar aus. Sollte hinter deinem Text irgendeine Art von Forderung nach einer Antwort ans Forum stecken erklär mir die Grundlage auf der du irgendwas forderst. Alle hier sind freiwillig da. Antworten bekommt man wenn die Frage interessant ist und man damit potentielle Helfer interessiert und man es auch irgendwie verständlich rüber bringt und nicht weil man ein Recht auf Antwort hat. Forderungen sind da eher ein dickes Minus. Bei mir auf jeden Fall. Ich mach dir ja auch keine Vorwürfe das du die 10000enden unbeantworteten Fragen die sich hier im laufe der Vergangenheit angehäuft haben nicht beantwortest hast bevor du es gewagt hast eine eigene Frage zu stellen.

          Und jetzt zu deiner Frage. Da du die einfach an deine letzte Antwort angehängt hast habe ich und vermutlich die meisten anderen nicht mal gemerkt das du eine Frage hast. Die Geschichte war für mich gelaufen und dir geholfen.
          Jetzt wo ich die gelesen habe verstehe ich die Frage nicht. Wer oder was ist MyIntBox?

          Comment


          • #6
            Geändert von bjoernbw (13.12.2013 um 19:28 Uhr) Grund: anschluss Frage, Link eingefügt
            Wer soll erkennen, dass du da eine neue Frage hast. Der Beitrag taucht in keiner Liste neuer Beiträge auf.

            Dann wusste man wieder wer 'das' ist.
            Und wenn du in allen Foren Probleme hast, würde ich mal überlegen ob das dann an den "Anderen" liegt. Vielleicht liegt es mehr an solchen Beiträgen wie du sie verfässt, dass dann keiner mehr Lust hat.
            Oder du solltest dich informieren, wie Forumsoftware funktioniert (Damit deine Beiträge als "Neu" erkannt werden)

            Würden ab Morgen, alle User sich nur noch via Anonymisierungssoftware einloggen,
            Und was das Geschwurbel über die Überwachung damit zu tun hat, erschließt sich nicht. Warum solltest du an deiner IP erkannt werden? Warum sollten Mods verschwinden, wenn du per div. ProxyIPs kommst? Schreibst du dann andere Beiträge?
            Zuletzt editiert von Christian Marquardt; 19.12.2013, 20:52.
            Christian

            Comment


            • #7
              Originally posted by Christian Marquardt View Post
              würde ich mal überlegen ob das dann an den "Anderen" liegt.
              Ja, die Anderen... na wenn es alle sagen muss es doch an dier liegen.
              So haben wir früher in der Schule 'ihn' oder 'sie' fertig gemacht, mit solchen Rechfertigungen.
              Bevor Christian mich nun bedauert, ich war nicht 'sie' oder er ich stand vorn, in der ersten Reihe wenns losging.

              Originally posted by Rals
              das du die 10000enden unbeantworteten Fragen
              Es gibt einige Antworten von mir, nur eben mit anderem Namen, aus Gründen wie oben beschr.
              Warum gibt es denn diese unbeantworteten, wären morgen alle anonym unterwegs, würden auch vieleandere wieder zurückkomen, die sich vor Jahren verabschiedet haben, aus Gründen von...

              Namen in Foren sind inzwischen ein Refrenznachweis, mindestens seit 5 Jahren, soviel nochmal zu der Freiwilligkeit.

              Die ist die Classe MyIntBox, hatte ich vergessen, pech für mich, kann man nun leicht gegen halten,
              gegen das was ich oben schrieb.

              Leider krieg ich es heute nicht mehr so zusammen, wie vor ein paar Tagen war, soll heissen:
              wird OnPaint durchlaufen, dann ist der Sender in jedem Fall 'MyTextbox',
              nicht wie vorher je nach AUfruf einmal MyIntbox und MyTextBox

              Von mir aus kann das richtig sein, am Ende bleibt:
              Warum tritt kein Error oder zumindest anderes Verhalten auf,
              wenn ich das Überschreiben des Events weglasse, soll heissen:

              In MyTextbox steht die Methode OnPaint ohne 'virtual' und in MyIntBox wird sie auskommentiert.
              Der Aufruf geht dann sofort von OnResize an die Basisklasse und trotzdem verhält sich alles wie vorher.

              Warum überschreibe ich denn Methoden oder Eigenschaften in einer Subklasse,
              um den Zustand der Basisklasse nicht zu ändern.
              Hier, bei Events, kann man es weglassen und es geht trotzdem.



              public class MyIntBox : MyTextBox
              {

              public MyIntBox()
              {
              this.BackColor = Color.Blue;
              }

              public override Color BackColor
              {
              get { return base.BackColor; }
              set { base.BackColor = value; }
              }

              protected override void OnResize(object sender, EventArgs e)
              {
              Rectangle rect = this.ClientRectangle;
              Bitmap bmp = new Bitmap(rect.Width, rect.Height);
              Graphics g = Graphics.FromImage(bmp);
              base.OnResize(this, e);

              PaintEventArgs r = new PaintEventArgs(g, rect);
              OnPaint(this, r);
              }

              protected override void OnPaint(object sender, PaintEventArgs e)
              {
              base.OnPaint(this, e);
              }
              }

              Comment


              • #8
                "Namen in Foren sind inzwischen ein Refrenznachweis, mindestens seit 5 Jahren, soviel nochmal zu der Freiwilligkeit."
                Da ist ja eine Menge an mir vorbeigegangen, wenn dem so wäre oder du bist in merkwürdigen Foren unterwegs. Mir ist das jedenfalls noch nicht begegnet. Wenn du natürlich in den Foren trollst wird man dich erkennen, an der Schreibweise (Rechtschreibfehler u.a.) und an der Art sich auszudrücken (siehe Wodim mit seinem Gitarrendings).

                Jedenfalls deine Frage verstehe ich nicht. Wann ist da der falsche sender drin? Hast du mal debuggt? Üblicherweise nimmt man auch kein neues PaintEvent, sondern invalidiert die gewünschten Bereiche bzw. führt einen "Refresh" aus
                Christian

                Comment


                • #9
                  wird OnPaint durchlaufen, dann ist der Sender in jedem Fall 'MyTextbox',
                  nicht wie vorher je nach AUfruf einmal MyIntbox und MyTextBox
                  Könnte ich jetzt in einer kurzen Programmierübung nicht nachvollziehen. Und ich habe auch Vorstellungsprobleme wie das sein könnte.
                  OnPaint ist ja in den untiefen der Controlhierarchie implementiert.


                  Und sieht etwa so aus (dem Control aus dem 4.0er Framework entnommen)
                  [HIGHLIGHT=C#]
                  protected virtual void OnPaint(PaintEventArgs e)
                  {
                  PaintEventHandler handler = (PaintEventHandler) base.Events[EventPaint];
                  if (handler != null)
                  {
                  handler(this, e);
                  }
                  }
                  [/HIGHLIGHT]

                  Da geht also auch immer this rein.
                  Wie hast du den Typ in OnPaint ermittelt? Also sowas wie Sender.GetType() oder ein Test mit dem is oder as Schlüsselwort?


                  Namen in Foren sind inzwischen ein Refrenznachweis, mindestens seit 5 Jahren, soviel nochmal zu der Freiwilligkeit.
                  Es gibt nicht nur den totalen Alltruismus und totalen Egoismus. Erlaube mir doch ein wenig grau zu sein und glaube einfach das wir tatsächlich helfen wollen wenn wir den können.

                  Comment


                  • #10
                    "Es gibt nicht nur den totalen Alltruismus und totalen Egoismus. Erlaube mir doch ein wenig grau zu sein und glaube einfach das wir tatsächlich helfen wollen wenn wir den können. "

                    gerne, bei diesem Thema willich mich gerne geirrt habe(in diesem Forum)

                    Die beiden Textboxen, sind nur Vehicle, um das Überschreiben von Events nachzuvollziehen.
                    Deswegen auch das Shape Beispiele, man kann den Effect dort besser sehen(scheint mir so).
                    http://entwickler-forum.de/archive/i...p/t-70135.html
                    (es ist eine Konsolenanwendung, man kann sie 1:1 kopieren, in der Methode : "protected virtual void OnShapeChanged
                    das "virtuell" rausnehmen und in der Classe circle "protected override void OnShapeChanged" auskommnetieren, F5 und alles läuft wie vorher.

                    Mit dem Überschreiben will ich doch erreichen, dass das Event für die jeweilige Klasse ausgelösst wird(hier eben für Basis oder Subklasse).
                    In beiden Beispielen ist es nun aber so: überschreibe ich das Event nicht, wird es trotzdem für die jeweilige Klasse ausgelösst?
                    Zuletzt editiert von bjoernbw; 20.12.2013, 20:37. Reason: link

                    Comment


                    • #11
                      Deswegen auch das Shape Beispiele, man kann den Effect dort besser sehen(scheint mir so).
                      Du hast wieder das Beispiel mit den Textboxen verlinkt. Das war vermutlich nicht gemeint?

                      In beiden Beispielen ist es nun aber so: [/COLOR][B]überschreibe ich das Event nicht, wird es trotzdem für die jeweilige Klasse ausgelösst?
                      Ja, der Nachfahre hat immer mindestens die selbe Oberfläche wie sein Vorfahre und kann erstmal das gleiche. Wenn du ein (virtuelle) Methode überschreibst, dann base.Methode mit den gleichen Parametern aufrufst ändert das rein gar nix die würde eh aufgerufen werden.

                      Comment


                      • #12
                        In beiden Beispielen ist es nun aber so: überschreibe ich das Event nicht, wird es trotzdem für die jeweilige Klasse ausgelösst?
                        Sicherlich, denn überschreiben heisst eigentlich dem vorgegebenen Verhalten neues hinzufügen oder anderes implementieren.
                        Christian

                        Comment


                        • #13
                          Ja lieber Ralf , das hast du recht, der Link war falsch und das macht es dir unmöglich das Beispiel mal aufzunehmen? Da gibt es keinen Aufruf "base.Methode".
                          Und sonst? Das ist wie du es erklärst? Mehr gibts da nicht?

                          Comment


                          • #14
                            Da gibt es keinen Aufruf "base.Methode".
                            Und sonst? Das ist wie du es erklärst? Mehr gibts da nicht?
                            Ja, deshalb passiert dort nichts. Bei dir wird das Standardverhalten ausgeführt, mit base.Methode. Insofern ist das überschreiben dann sinnlos, wenn nichts weiter gemacht wird. Mehr gibt es nicht

                            Sicherlich, denn überschreiben heisst eigentlich dem vorgegebenen Verhalten neues hinzufügen oder anderes implementieren.
                            Christian

                            Comment


                            • #15
                              und das macht es dir unmöglich das Beispiel mal aufzunehmen
                              Wie soll ich auf was genau eingehen was ich nicht zu sehen bekomme? Oder auf welches Beispiel soll ich den eingehen? Du hast etwas verlinkt zwischendurch hast du mal Code gepostet und dann ein Problem beschrieben das nichts (soweit ich das erraten kann) mit dem vorher angesprochenen zu tun hat. Eigentlich kamm bei mir bisher nur Verwirrung an und ich habe auf etwas geantwortet was ich vermutlich für das Problem hielt in der Hoffnung es würde dir helfen bzw. verdeutlichen das wir nicht verstanden haben was du willst und du würdest konkreter werden.

                              Wie wär es mal mit was ganz konkretem. Der Sorte - Das ist mein Code, das wollte ich erreichen, es passiert aber was anderes, warum oder was müsste ich anderes tun um mein Ziel zu erreichen? Das ist ein Format das in Foren funktioniert wenn sich die Beteiligten nicht kennen.

                              Comment

                              Working...
                              X