AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PaintBox flackert trotz Double Buffer

Ein Thema von Muhkopp · begonnen am 9. Sep 2015 · letzter Beitrag vom 9. Sep 2015
 
Muhkopp

Registriert seit: 1. Feb 2015
4 Beiträge
 
#1

PaintBox flackert trotz Double Buffer

  Alt 9. Sep 2015, 09:07
Hallo

Ich wollte mir ein kleines Tool bauen und verzweifle ein bisschen an dem Flackern meiner PaintBox.
Nachdem mir die Google-Anfrage-Begriffe ausgehen, wollte ich mal die Profis fragen

Mein Tool sollte ein rahmenloses Vollbildfenster darstellen, das komplett mit einer PaintBox gefüllt ist. Diese sollte im Onpaint ganz klassisch ein TBitmap zeichnen und gut. Im MouseMove wird PaintBox.Invalidate aufgerufen, jedoch flackert der Zeichenvorgang im MouseMove ganz fürchterlich.


Für die rahmenlose Vollbildeinstellung habe ich folgenden Schnipsel gefunden (und dankbar benutzt):
Delphi-Quellcode:
procedure FormVollbild (const aForm :TForm);
var
  i : Integer;
begin
  aForm.BorderStyle := bsNone;
  i := (aForm.Width - aForm.ClientWidth) div 2;
  aForm.SetBounds(-i,-i,(Screen.Width + 2*i),(Screen.Height + 2*i));
end;
Danach wird ein Bitmap in Größe des Zeichenbereichs erstellt, und eine Kopie davon.

Im MouseMove der PaintBox passiert dann:
Delphi-Quellcode:
procedure TVollbildForm.PaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  fBmpZeichnen.Assign(fBmpVorlage);
  { Hier wird etwas in fBmpZeichnen.Canvas gezeichnet }
  PaintBox.Invalidate;
end;
Das OnPaint der PaintBox sieht so aus:
Delphi-Quellcode:
procedure TVollbildForm.PaintBoxPaint(Sender: TObject);
begin
  PaintBox.Canvas.Draw(0,0,fBmpZeichnen);
// BitBlt(PaintBox.Canvas.Handle,0,0,PaintBox.Width,PaintBox.Height,fBmpZeichnen.Canvas.Handle,0,0,SRCCOPY);
end;
Die Form hat (außer den Default-Werten von XE8)
KeyPreview := true;
BorderStyle := bsNone;
Außerdem rufe ich die Form mit ShowModal auf (natürlich nach einem TForm.Create(nil)).

So weit, so gut.

Wie man schon sieht, habe ich BitBlt wie auch Draw gestestet, beides mal leider das selbe traurige Ergebnis.
Ich habe die Form mit aktivem DoubleBuffer, aber auch schon ohne probiert: mit dem standard Windows-Stil habe ich im Bildaufbau immer einen Moment, in dem die Paintbox auf ihre Hintergrundfarbe zurück springt, bevor das Bitmap wieder angezeigt wird. Das ist nicht das gleiche flackern, als wenn ich direkt auf die PaintBox zeichnen würde, aber trotzdem optisch abschreckend.

Wenn ich einen der Embarcadero UI-Styles benutze (ich habe Obsidian probiert), dann habe ich verrückterweiße so ein wildes Flackern, als ob ich direkt in der PaintBox kachelweiße das Bitmap einzeichnen würde, anstatt komplett in einem Rutsch. Gibt es dazu irgendwelche Erkenntnisse, für mich wirkt das fast wie ein Bug...

Ich habe auch schon jeweils Release-Versionen erzeugt, es liegt also auch nicht am Debugger.

Ich benutze
Embarcadero XE8 Delphi (v22.0.19027.8951)
Windows 7 x64 Enterprise (neuster Updatestand)


Ich bin für alle Hinweiße dankbar, wenn gewünscht kann ich auch gern noch mehr Code nachliefern, ich wollte den Beitrag nicht noch länger machen.

Liebe Grüße, der Muhkopp
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 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