OnPaint und invalidate
-
Ich habe da mal eine Verständnisfrage. Also ich habe eine Picturebox auf der ich mittels des OnPaints ereignisses etwas "gemalt" habe. Nun möchte ich später, nachdem das ereignis vorbei ist, erneut etwas zeichnen.
Also rufe ich die methode invalidate() der PictureBox auf und lasse erneut malen.
Da ich an diese keine Prameter übergeben kann, manipuliere ich Membervariablen oder? Arbeite ich dann mit lauter else if bzw switch case Anweisungen, um abzufangen was ich wann wo und wie malen möchte?
-
Hört sich doch alles sehr vernünftig an... das OnPaint wird ja auch ausgeführt, wenn Du z.B. das Fenster wieder maximierst... da kommen ja auch keine Parameter mit...
-
wanderameise schrieb:
Da ich an diese keine Prameter übergeben kann, manipuliere ich Membervariablen oder? Arbeite ich dann mit lauter else if bzw switch case Anweisungen, um abzufangen was ich wann wo und wie malen möchte?
das Zauberwort ist hier "OOP" ... Du brauchst nur eine Membervariable die entsprechend ein Malobjekt beinhalten kann ... das Malobjekt erweiterst Du entsprechend dessen was jeweils gezeichnet werden soll ... dann brauchst Du nur der Membervariable ein entsprechendes Kind des Malobjektes zuweisen -> Invalidate();
-
Ist das jetzt Win32-API oder MFC?
C++/CLI ist es definitiv nicht
-
Jochen Kalmbach schrieb:
C++/CLI ist es definitiv nicht
falls Du mich meinst - ja es ist C++/CLI
-
danke jochen, aber nochmal wegen dem aufruf: Sagen wir ich rufe die onpiat methode 10 mal und ich will 10 mal etwas anderes ausführen, wie entscheide ich das? via einer switch case oder else if anweisung in der onpaint funktion?
es reicht ja nicht nur membervariablen zu ändern: einmal will ich ein rechteck, einmel einen kreis, ein anderes mal einen hund malen. das muss ich ja der onpaint methode sagen!
was ist die beste lösung?
-
public ref class Malobjekt { public: virtual void PaintIt(Graphics ^gfx) = 0; };
public ref Linie : public Malobject { public: virtual void PaintIt(Graphics ^gfx) { gfx->DrawLine(/* blabla */); } };
public ref Image : public Malobject { public: virtual void PaintIt(Graphics ^gfx) { gfx->DrawImage(/* blabla */); } };
Malobjekt ^malobjekt; // ... PictureBox1_Paint(Object ^sender, PaintEventArgs ^e) { malobjekt->PaintIt(e->Graphics); } // ... Button1_Click(/* blabla */) { malobject = new Line(); pictureBox1->Invalidate(); } Button2_Click(/* blabla */) { malobject = new Image(); pictureBox1->Invalidate(); }
-
können die klassen Member einer anderen klasse sein oder muss ich für jede klasse eine eigene header/cpp anlegen?
ich meine ich habe ja schlimmstenfalls 10 grafikklassen und jeder steht eigentlich eine eigene implementation zu, sprich header+cpp?!edit: evtl verschachtelte klassen kommen mir da in den sinn?
-
was ich nicht verstehe, ist, wieso es nicht so klappt wie ich es versuche:
public ref class Playground:PictureBox { public: Playground(); void fill_rectangle(int x, int y); Graphics^ gfx; }; ... void Playground::OnPaint(PaintEventArgs^ e) { /*zuweisung des grafikelemtes an member variable*/ this->gfx = e->Graphics; /*code*/ gfx->DrawLine(p,x1,x2); //alles wunderbar } void Playground::fill_rectangle(int x, int y) { /*methode wird über button aufgerufen*/ /*code*/ this->gfx->FillRectangle(b,r); //funktioniert nicht, fehlermeldung zur laufzeit hier!! this->invalidate() }
Ich weise das e->Graphics einer variablen zu um jederzeit drauf zugreifen zu können, aber irgendwie mach ich da was falsch.
-
wanderameise schrieb:
Ich weise das e->Graphics einer variablen zu um jederzeit drauf zugreifen zu können,
vermutlich ist die nullptr ... ggf. sind auch b oder r nullptr ... aber solange Du nicht sagst was für ein Fehler kommt - wird Dir da keiner helfen können
aber irgendwie mach ich da was falsch.
Du machst generell was falsch ... selbst wenn kein Fehler kommt, würde das nicht richtig funktionieren ... nur Zeichenoperationen die vom Paint-Event ausgelöst gezeichnet werden bleiben erhalten ... alle anderen Zeichenoperationen "verschwinden" mit der Zeit
-
mit zeichenoperationen meinst du das graphics element?
nochmal zu deinem vorherigen post:
können die klassen Member einer anderen klasse sein oder muss ich für jede klasse eine eigene header/cpp anlegen?
ich meine ich habe ja schlimmstenfalls 10 grafikklassen und jeder steht eigentlich eine eigene implementation zu, sprich header+cpp?!edit: evtl verschachtelte klassen kommen mir da in den sinn?