Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden (https://www.delphipraxis.net/180630-canvas-soll-nicht-auf-parent-canvas-sondern-bitmap-gezeichnet-werden.html)

mb.99 4. Jun 2014 12:33

Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Hallo,


um das Flackern des Canvas (KlasseA :TCosumControl) zu vermeiden möchte ich alles erst in ein PufferBitmap zeichnen,
das Problem ist das KLasseA der Parent mehrerer anderer TCostumControlls(MouseClock... soll erhalten bleiben) ist die sich selbst auf die Canvas von KlasseA zeichnen.

Wie löse ich das geschicktesten.

Gruß

Bjoerk 4. Jun 2014 12:55

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
TCosumControl; das Problem ist das KLasseA der Parent; TCostumControlls; MouseClock; ist die sich selbst auf die Canvas von KlasseA zeichnen. Sorry, aber wer soll das verstehen? :?

p80286 4. Jun 2014 13:02

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
U.U brauchst Du nur
Delphi-Quellcode:
.Doublebufferd
(und etwas Geduld um Deine Frage nochmals durch zu lesen)

Gruß
K-H

mb.99 4. Jun 2014 13:12

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Dann versuche ich es etwas genauer zu erklären:

KlasseA : TCostumControl; // Klasse A dient als Container für Objekte der KLasse B,
KlasseA.Paint
{
- Hier wird der Hintergrund als Karo gezeichnet.
}


KlasseB : TCostumControl; // KlasseB stellt ein auf KlasseA bewegbares Objekt dar, es kann mit der Maus verschoben werden
KlasseB.Paint
{
Hier wird ein farbiges Rectangle mit Text gezeichnet.
}


KlasseC : TForm // hier wird ein Objekt von KlasseA und eine dynamische Anzahl von KLasseB-Objekten erzeugt


Da KLasseA der Parent von Objekten der KlasseB ist zeichnen die Objekte der Klasse B ihr Canvas auf das ParentCanvas.
Ich möchte es aber wie bereits erwähnt in einer Bitmap zwischenspeichern um das Flackern zu vermeiden.

DeddyH 4. Jun 2014 13:18

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Ich mag mich irren, aber TCustomControl zeichnet AFAIK auf seinen eigenen Canvas, im Gegensatz zu TGraphicControl.

Bjoerk 4. Jun 2014 13:21

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Würde sagen, bissl viel Canvas?

Edit: TGraphicControl hat auch schon ein eigenes Canvas.

mb.99 4. Jun 2014 13:35

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
In der Paintmethode zeichnet jeder ins eigene Canvas, ich gehe davon aus das in der Urklasse das eigene Canvas auf das Parent.Canvas gezeichnet wird, sonst würde man ja nur den Inhalt des Parent.Canvas sehen.

mb.99 4. Jun 2014 15:12

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Ich habe es hinbekommen alles auf eine BitMap zu zeichnen, mit dem Flackern ist es jetzt vorbei,
dafür sind neue Probleme aufgetreten:

Beim Verschieben der Objekte enstehen Frackmente und teilweiße wird der Hintergrund auf das Objekt gezeichnet.

Am BitMap kann es definitiv nicht liegen, ich habe mir mit dem Befehl SaveToFile einige Screenshoots ausgeben lassen,
auf denen alles einwandfrei aussah.

Die Zeichenmethode wird im MouseMove aufgerufen:

- DrawBackground
- DrawObjects
- BitMapToCanvas


Habt ihr eine Ahnung woran das liegen könnte?

DeddyH 4. Jun 2014 15:16

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Hast Du den Vorschlag, DoubleBuffered der "Parentkomponente" auf true zu setzen, schon versucht?

Blup 4. Jun 2014 15:17

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Es wurde doch schon gesagt:

KlasseC.DoubleBuffered := True; // Formular
KlasseA.DoubleBuffered := True; // Hintergrund

Damit kümmern sich die Sreuerelemente selbst um eine Bitmap, den ganzen Zeichenkram und alles was dazu gehört.
Erst wenn das nicht funktioniert sollte man über eine eigene Lösung nachdenken.


Die Artefakte entstehen vermutlich, weil du nicht alle notwendigen Bereiche neu zeichnest.

mb.99 4. Jun 2014 15:23

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
DoubleBuffered bringt leider überhaupt nichts,

der Grund für die Grafikfehler liegt wohl darin das ich auf ein TCostumControl male wenn ich diess verschiebe nimmt
es die Pixel mit obwohl diese dem Parent.Canvas gehören.

Sir Rufo 4. Jun 2014 15:54

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Darum solltest du auch von Delphi-Referenz durchsuchenTGraphicControl ableiten, da ist schon die fertige Verdrahtung drin, wenn die Komponente neu gezeichnet werden muss.

Du kannst dir die Klasse aber auch anschauen und dann alle benötigten Teile übernehmen (quasi alles)

PS

Für Quelltexte nimm doch bitte die
Code:
[DELPHI]
[/DELPHI]
Tags oder (wenn nicht Delphi) die CODE-Tags (statt DELPHI einfach CODE in die eckigen Klammern)

mb.99 4. Jun 2014 15:56

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Ich habe anstelle von TCostumControl die TGraphicControl genommen, wenn man die Objekte schnell bewegt läufts zwar etwas holprig aber damit kann ich leben.

Edit: Da war einer schneller..

Danke für eure Hilfe

Sir Rufo 4. Jun 2014 16:00

AW: Canvas soll nicht auf Parent.Canvas sondern Bitmap gezeichnet werden
 
Zitat:

Zitat von mb.99 (Beitrag 1261396)
Ich habe anstelle von TCostumControl

Wohl eher Delphi-Referenz durchsuchenTCustomControl oder hast du die Karneval-Edition von Delphi? :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 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