![]() |
Canvas flackern bei VCL Styles
Hallo,
Mein Problem ist Folgendes: Ich zeichne per Canvas auf eine PaintBox, wenn ich aber einen anderen VCL-Style als den Windows Standard Style verwende werde ich trotz der eingeschalteten Property DoubleBuffered mit einem hässlichen Flackern konfrontiert. Im Windows Style läuft aber alles flüssig. Weiss jemand woran das liegen könnte beziehungsweise, wie man das beheben könnte? Oder ist das ein Bug der IDE? Bin für jede Antwort dankbar Liebe Grüsse TTF |
AW: Canvas flackern bei VCL Styles
Hallo,
Zitat:
Zitat:
Ich lege mir eine Paintbox und ImageList (14 Bitmaps 256x256 Pixel) auf ein Formular und lass mir mal was in der Paintbox zeichnen
Delphi-Quellcode:
egal welchen Style ich verwende, da flackert nix, da ruckelt nix.
procedure TForm1.PaintBox1Paint(Sender: TObject);
var i, j : Integer; begin for i := 0 to 10 do for j := 0 to ImageList1.Count - 1 do ImageList1.Draw (PaintBox1.Canvas, Random (Width), Random (Height), j, True) end; Zurück zur Frage: Was zeichnest Du? Code wäre da sicherlich recht hilfreich. Gruß |
AW: Canvas flackern bei VCL Styles
Danke für die Antwort. Ich zeichne eine Waveform mithilfe der Bass.dll. Ganz ähnlich wie im custloop Sample.
Vielleicht liegt es daran, dass ich das ganze mit einem Timer recht häufig update. Ich wüsste jedoch nicht, warum es dann nur bei Windows style funktionieren sollte. Der Vorgang dabei ist folgender: Ich scanne die Peaks von der Audiodatei und übertrage dann Linie für Linie die Waveform auf ein TBitmap, das ich dann in die PaintBox malen lasse. Ist daran etwas falsch oder so? Code kann ich Grade leider nicht geben, da ich nicht am Computer bin. Ich glaube ohnehin nicht, dass es auf ein Detail im Code ankommt, sondern auf das Prinzip. Falls es aber nötig ist, editiere ich gerne noch etwas rein. Liebe Grüsse TTF |
AW: Canvas flackern bei VCL Styles
Flackern + TPaintbox = Es wird sehr wahrscheinlich nicht im OnPaint der Paintbox gezeichnet. Richtig wäre es daher im Timer (der kann praktisch nicht zu schnell sein) nur das das Bitmap neu zu zeichnen, und dann TPaintbox.Invalidate aufzurufen. Im TPaintbox.OnPaint Ereignis sollte dann das Bitmap auf den Paintbox-Canvas geblittet werden. Das wäre auch unabhängig von Styles der saubere Weg.
|
AW: Canvas flackern bei VCL Styles
Zitat:
|
AW: Canvas flackern bei VCL Styles
Also das Codeschnipsel:):
Delphi-Quellcode:
Weiss jemand woran es liegen könnte?
procedure TForm1.Timer1Timer(Sender: TObject);
begin if Buffer.Width <> PaintBox1.Width then begin Buffer.Width := PaintBox1.Width; StartPeakScan; end else begin Buffer.Width := PaintBox1.Width; Buffer.Height := PaintBox1.Height; DrawSpectrum; end; PaintBox1.Refresh; end; //und dann Painten procedure TForm1.PaintBox1Paint(Sender: TObject); begin PaintBox1.Canvas.Draw(0, 0, Buffer); end; |
AW: Canvas flackern bei VCL Styles
Delphi-Quellcode:
Warum?
If Buffer.Width = PaintBox1.Width then Buffer.Width := Paintbox1.Width
Auch: Vielleicht habe ich es nicht ganz verstanden. Aber XE4. Warum nicht mit TChart? Hast du mal die Zeit gemessen, wie lange ein Timerdurchlauf benötigt? Und: Hast du mal versucht, zur Laufzeit den VCL-Stil zu wechseln? Wie verhält es sich dann? |
AW: Canvas flackern bei VCL Styles
Zitat:
Delphi-Quellcode:
, um beim Resizing die Grösse des Bildes der PaintBox anzupassen.
if Buffer.Width <> PaintBox1.Width then Buffer.Width := Paintbox1.Width
Zitat:
Zitat:
Delphi-Quellcode:
ICh weiss wirklich nicht mehr weiter.
procedure TForm1.Button4Click(Sender: TObject);
begin if Assigned(TStyleManager.ActiveStyle) and (TStyleManager.ActiveStyle.Name<>'Windows') then begin TStyleManager.TrySetStyle('Windows'); end else begin TStyleManager.TrySetStyle('Amakrits'); end; end; |
AW: Canvas flackern bei VCL Styles
Zitat:
Delphi-Quellcode:
if Buffer.Width <> PaintBox1.Width then
begin Buffer.Width := PaintBox1.Width; <-- Wenn ungleich, ... StartPeakScan; end else begin Buffer.Width := PaintBox1.Width; <-- Wenn gleich, dann auch Buffer.Height := PaintBox1.Height; DrawSpectrum; end; Zitat:
Ich schwafele nur und kann kein konkretes Tutorial geben, würde aber trotzdem mit Nachdruck empfehlen, da bei naher Gelegenheit unbedingt reinzuschauen. Ich finde, man kann damit wirklich eine große Menge Zeit sparen! Blöd mit der Paintbox. Meine einzige Erklärung wäre gewesen, dass das Zeichnen des Formulars wegen den Stilen entsprechend länger dauert und dein Timer zu oft feuert. Kannst du den vlt. etwas herunterdrehen? Vielleicht könntest du die Paintbox manuell einfrieren? Wenn ich es richtig in Erinnerung habe, könntest du, an der VCL vorbei, mittels
Delphi-Quellcode:
nach (oder vor?) der Neuberechnung ein
SendMessage
Delphi-Quellcode:
mit
WM_SETREDRAW
Delphi-Quellcode:
zum Einfrieren und im onPaint wieder mit 1 zum Aufwachen schicken.
LParam = 0
Ich sehe nur, dass ich in meiner Anwendung bestimmt bald ein Dutzend TCharts habe und die funktionieren auch beim Live-Wechsel des VCL-Stils weiterhin und flackern nicht. Vielleicht kannst du mit dem Debugger durchwandern und finden, wo bzw. wann es flackert? Wie hängt die Timer-Geschwindigkeit damit zusammen? Statt Paintbox.Refresh mal PaintBox.Invalidate probiert? |
AW: Canvas flackern bei VCL Styles
Liste der Anhänge anzeigen (Anzahl: 1)
Danke erstmal für die Hilfe. Ich habe den Timer nun auf 200ms zurückgesetzt. Nun sind nur noch vereinzelt Flackern(aber trotzdem zuviel) zu sehen. Es scheint wirklich mit dem Timer zusammenzuhängen, aber nicht mal darauf kann man gehen. Das Ding flackert oder nicht, wie die GPU gerade lustig ist. Bei 400ms ist das Ergebnis schon fast anschaubar, aber natürlich dauert das Zeichnen beim Laden oder resizen. Es flackert 'nur' noch alle 4-5 sekunden. Und so geht das weiter (600ms => 6-7sec). Aber das kann es kann ja irgendwie nicht sein:x. Ich gebe ja zu, ich habe einen Laptop und vielleicht nicht die Beste Grafikkarte, aber so ein Bisschen Wellenlinien könnte man doch schon aushalten:|, zumal man als liebe liebe GPU bei transparenten Fenstern(Windows aero) imho sich sogar noch ein bisschen mehr anstrengen muss, als bei den nicht transparenten.
Hat jemand ein gutes Tutorial für TChart, weil das ja sein soll? Ich hänge mal das ganze Projekt an(ist eig nur ein Testprojekt) an: Wegen dem doppelten Buffer.width. ja, was soll man sagen :stupid:. Falls jemand Zeit hat sich das anzuschauen, bin ich dankbar. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 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