Einzelnen Beitrag anzeigen

Muhkopp

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

PaintBox flackert trotz Double Buffer

  Alt 9. Sep 2015, 10: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