Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Flimmern beim zeichnen (https://www.delphipraxis.net/81285-flimmern-beim-zeichnen.html)

Mjöllner 24. Nov 2006 06:24


Flimmern beim zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo erst mal
ich arbeite in der Schule gerade an einem Projekt zum darstellen von 3D-Objekten.
Es ist komplett Vektor-basierend.

Jedenfalls kommt es beim zeichnen immer wieder zu starken flackern.

Ich hab doublebuffered auf true gesetzt.
Ich zeichne erst auf ein TImage und setze das dann direkt aufs Form.

Ich weiß nicht,warum es trotzdem flackert. ICh zeichne bei meinem Beispielobjekt etwa 530 Punkte. Daran sollte es aber denke ich nicht liegen.
Ich vermute, ich hab die diese Offset screen methode einfach noch nich vertanden :(

Der Quelltext ist beigefügt.

Danke für die Hilfe,
mfg
Mjöllner

DGL-luke 24. Nov 2006 07:35

Re: Flimmern beim zeichnen
 
wenn du selbst schon mit offscreen-bitmap arbeitest, kann DoubleBuffered eher schaden als nützen.

Mjöllner 24. Nov 2006 07:50

Re: Flimmern beim zeichnen
 
habs auch ohne getestet, bringt keine verbesserung :(

Muetze1 24. Nov 2006 09:56

Re: Flimmern beim zeichnen
 
Wozu zeichnest du noch auf ein TImage anstatt es auf ein TBitmap zu zeichnen?

Mjöllner 24. Nov 2006 11:14

Re: Flimmern beim zeichnen
 
ich denke genau da liegt das Problem.
ich wusste nicht, wie ich dem Formular diese Bitmap überhelfen kann.

Ich habs bloß so gesehen:
Delphi-Quellcode:
Form.Canvas.Draw(0,0,Graphic)
wobei Graphic vom Typ TGraphic sein muss.
Wenns anders geht, würd ich mich freuen!

Aenogym 24. Nov 2006 11:59

Re: Flimmern beim zeichnen
 
Zitat:

Zitat von Mjöllner
Wenns anders geht, würd ich mich freuen!

Delphi-Quellcode:
  BitBlt(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight,
         SourceCanvas.Handle, 0, 0, SRCCOPY);

kolbaschedder 24. Nov 2006 12:13

Re: Flimmern beim zeichnen
 
Das Flimmern kommt daher, dass Windows immer zuerst den Hintergrund zeichnet, der dann wieder übermalt wird.

Ich würde das ganze auf ein Panel zeichnen.

in der FormCreate folgende zeile einfügen.

Delphi-Quellcode:
panel1.controlstyle := panel1.controlstyle +[csOpaque];
Diese Zeile bewirkt, dass windows den Hintergrund nicht neu zeichnet.

Das Kopieren des Bitmap auf das Panel erfolgt dann in der

Panel1.onPaint;

neu zeichnen nie durch den direkten Aufruf von onPaint erzwingen, sondern

panel1.invalidate;

aufrufen.

kolbaschedder 24. Nov 2006 12:26

Re: Flimmern beim zeichnen
 
Ok, ich hab mal dein Programm runtergeladen. Es reicht völlig, wenn du den direkten aufruf von

zeichnen;

durch

invalidate;

ersetzt. (ausser natürlich in der FormPaint() )

Mjöllner 24. Nov 2006 12:39

Re: Flimmern beim zeichnen
 
nett das du nochmal was geschrieben hast, ich bin nämlich gerade daran gescheitert, dieses Panel in meni Programm einzufügen :D

Mit dem invalidate ist schon viel getan! Es laufen zwar immer noch graue Balken durchs Bild, aber es sieht schon besser aus. Jetzt werd ich mich mal darum kümmern, das restliche Programm effektiver zu gestalten, dann siehts bestimmt auch wieder besser aus!


Vielen dank erst mal an alle, die geholfen haben!

kolbaschedder 24. Nov 2006 14:07

Re: Flimmern beim zeichnen
 
Bei mir läuft es absolut flimmerfrei. Schau mal nach, ob du alle aufrufe deiner Zeichnen-Routine durch "Invalidate" ersetzt hast.

Mjöllner 24. Nov 2006 15:13

Re: Flimmern beim zeichnen
 
Jopp, ich hatte DoubleBuffered wieder deaktiviert...

Jetzt läufts wirklich super :thumb:


vielen vielen dank, ich empfehle euch weiter :D

Cöster 1. Dez 2006 20:07

Re: Flimmern beim zeichnen
 
Zitat:

Zitat von kolbaschedder
Ich würde das ganze auf ein Panel zeichnen.

Ist eine PaintBox nicht am Besten zum Zeichnen geeignet?

Zitat:

Zitat von kolbaschedder
in der FormCreate folgende zeile einfügen.

Delphi-Quellcode:
panel1.controlstyle := panel1.controlstyle +[csOpaque];
Diese Zeile bewirkt, dass windows den Hintergrund nicht neu zeichnet.

Wie genau meinst du das? Kannst du ein kleines Beispiel-Programm/Beispiel-Code zeigen, woran die Wirkung von csOpaque erkennbar ist?
In der Delphi-Hilfe steht unter csOpaque nämlich folgendes:
Zitat:

Das Steuerelement füllt sein Client-Rechteck vollständig aus.
Mir ist nicht klar, was das mit dem Neu-Zeichnen zu tun hat.

Zitat:

Zitat von kolbaschedder
Das Kopieren des Bitmap auf das Panel erfolgt dann in der

Panel1.onPaint;

:wiejetzt: Ich finde im OI beim Panel kein OnPaint-Ereignis.

Muetze1 1. Dez 2006 22:30

Re: Flimmern beim zeichnen
 
Zitat:

Zitat von Cöster
Zitat:

Zitat von kolbaschedder
Ich würde das ganze auf ein Panel zeichnen.

Ist eine PaintBox nicht am Besten zum Zeichnen geeignet?

Ja

Zitat:

Zitat von Cöster
Zitat:

Zitat von kolbaschedder
in der FormCreate folgende zeile einfügen.

Delphi-Quellcode:
panel1.controlstyle := panel1.controlstyle +[csOpaque];
Diese Zeile bewirkt, dass windows den Hintergrund nicht neu zeichnet.

Wie genau meinst du das? Kannst du ein kleines Beispiel-Programm/Beispiel-Code zeigen, woran die Wirkung von csOpaque erkennbar ist?
In der Delphi-Hilfe steht unter csOpaque nämlich folgendes:
Zitat:

Das Steuerelement füllt sein Client-Rechteck vollständig aus.
Mir ist nicht klar, was das mit dem Neu-Zeichnen zu tun hat.

Wenn csOpaque gesetzt ist, füllt das Steuerelement seinen Client-Bereich nicht mit seiner Farbe aus sondern malt nix, dadurch wird es transparent.

Zitat:

Zitat von Cöster
Zitat:

Zitat von kolbaschedder
Das Kopieren des Bitmap auf das Panel erfolgt dann in der

Panel1.onPaint;

:wiejetzt: Ich finde im OI beim Panel kein OnPaint-Ereignis.

Dann nimm wie von dir vorgeschlagen eine TPaintBox


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz