C# Nur bestimmte Objekte aktuallisieren

Murphy9904

Lt. Junior Grade
Registriert
Mai 2007
Beiträge
344
Hi,
Ist es irgendwie möglich nur Bestimmte objekte zu aktullisieren die ich mit z.B. bla.DrawEllipse oder so erstellt hab?
ich hab ne Uhr gebastelt und die Zeiger sollen jede Sekunde aktuallisiert werden aber nicht der Ramen und so..
bisher hab ich es mit this.Refresh() gemacht
und bla.Clear(this.BackColor) löscht auch alles.
(der soll nur bei einer Größenänderung neu gezeichnet werden)

Danke schonmal
 
Hi!
Am besten mit Threading und Timer, wo du einen Intervall setzt.
Was genau benützt du überhaupt?
WinForms? Silverlight?
mfg
Ergänzung ()

sry ich glaub das vorige posting entspricht nicht genau das, was du dir vorstellst.
Wie ist es genau aufgebaut?
Machst du eine Ellipse und 2 Striche?
in dem Fall wäre es ja einfach da musst du nur Strich1.x,y und Strich2.x,y neu setzen und refreshen.
 
in dem Fall wäre es ja einfach da musst du nur Strich1.x,y und Strich2.x,y neu setzen und refreshen.
Gut und wie? - er tut ja dann die Ellipse und den Rest auch refreshen und das Braucht Zeit und dann blinkt die uhr Jede Sekunde auf.
 
Du zeichnest direkt auf die GUI oder auf ein bestimmtes Control? Mach doch mal ein Screenshot.

Das Prinzip der 2D Animation funktioniert immer über die Methode paint und die zeichnet immer alles neu. Es sei denn du platzierst die Zeichnungen aufverschiedene Controls.

Hier ein Beispiel jede Sekunde etwas neu zu zeichnen:

Timer timer = new Timer();
timer.Interval = 1000;
timer.Tick += paint;
timer.Start();

und vorher die Methode paint definieren:

void paint(object sender, EventArgs e){}
 
Zuletzt bearbeitet:
Ich zeichne Direkt auf die GUI..

so will ich dass das mal ausschaut: aber nach jeder Sekunde verschwindet die Uhr halt ganz kurz.. (schaut eben nciht schön aus)
weil ich mit this.refresh() einfach alles wieder lösche..
Unbenannt12.jpg


und wenn ich den Hintergrund weglasse und auch das this.refresh dann blinkt das zwar nich auf aber der alte Zeiger verschwindet halt logischerweise auch nicht.
Unbenannt2.jpg
 
Kannst du das Projekt mal gezipped hochschieben. Dann guck ich mir es mal an.
 
schon ausprobiert?
this.refresh tut einfach alle angezeigten Objekte Löschen :D
 
this.Refresh() zwingt die Form dazu unter anderem ihren jetzigen visuellen Status auf den Bildschirm zu zeichnen.
Wenn du es an dieser falschen Stelle aufrufst, ist es schon klar, dass erstmal nur die gelöschte Fassung gezeigt wird und nachher durch automatische Aktualisierung der Form die Fassung mit Uhr.

EDIT:
Mein Fehler, da stimmt aber allerdings irgendwas nicht.

EDIT2: Im Prinzip funktioniert die Refresh-Methode auch so, aber sie schließt diese Art von Manipulationen aus.

Das ändert aber nichts an der obigen Theorie, du musst halt einfach die Repaint-Methode oder so aufrufen.
Wenn das nicht geht, musst du die Paint-Methode der Form überschreiben und da deinen ganzen Zeichencode reinpacken. Im Timer-Event dann diese Paint-Methode aufrufen.
 
Zuletzt bearbeitet:
wie meinst du?
eine extra Methode nur für Zeiger oder wie soll ich das verstehn?
 
Da ich hab´s mal versucht.
Dabei gehe ich davon aus, dass ein Aufruf der "Refresh"-Methode ein Paint-Event auslöst.

Ich konnte es aber selber nicht debuggen/testen, weil ich kein VS2010 habe.
 

Anhänge

An der Position der Refresh Methode liegt es nicht. Getestet.
 
@ Dr. Greg House
Arbeite mit SharpDevelop und hab mir einfach ein GUI Projekt erstellt und die .cs Dateien
reingeladen. Läuft auch.
 
Eine Möglichkeit wäre mit nem DoubleBuffer zu arbeiten.. das verhindert Flackern, obwohl alles neu gezeichnet wird.
Die andere Möglichkeit die mir einfällt wäre den alten Zeiger mit der Hintergrundfarbe zu übermalen und erst danach den neuen einzuzeichnen und so komplett auf einen refresh zu verzcihten
 
Zuletzt bearbeitet:
Dabei gehe ich davon aus, dass ein Aufruf der "Refresh"-Methode ein Paint-Event auslöst.
Ja das klappt auch so wie dus ungefähr gemacht hast, aber flackert immernoch

aber die Idee die zeiger einfach zu übermalen klingt cool.. versuch ich gleich mal

also das ist jetzt nicht die Eleganteste Lösung aber es klappt :D
 
Zuletzt bearbeitet:
Double Buffering ist das richtige Stichwort. Danach würde ich einmal googeln. Das brauchst Du auch für andere Anwendungen.
 
Ja - Double-Buffering ist Pflicht.
Prinzip: alles auf einen Hintergrundspeicher zeichnen und diesen dann gegen den Vordergrundspeicher (tatsächliche Anzeige) austauschen (Vordergrundspeicher wird dann zum Hintergrundspeicher und umgekehrt).
 
Lass doch alles noch mal neu zeichnen. Soweit ich das von 2D und 3D kenne, wird es immer so gehandelt. Ob da jetzt Double Buffering vorkommt, sicher aber auch optional denke ich.

Dein eigentlicher Problem ist, du lässt auf dem alten Bild neue Elemente Zeichnen, wodurch du diesen unschönen Effekt hast.
 
Zurück
Oben