AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Flimmern bei bewegten Bitmaps für eine Prozessvisualisierung
Thema durchsuchen
Ansicht
Themen-Optionen

Flimmern bei bewegten Bitmaps für eine Prozessvisualisierung

Ein Thema von Andreas_R · begonnen am 5. Apr 2005 · letzter Beitrag vom 17. Aug 2005
 
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Flimmern bei bewegten Bitmaps für eine Prozessvisualisie

  Alt 7. Apr 2005, 21:22
Tipp von mir
Wenn man, z.B. eine Grafik mit einem Timer verschiebt, treten störende Flickereffekte auf. Kann ich das irgendwie abstellen?

Ja das ist Möglich.
1. Die einfachste Möglichkeit ist es DoubleBuffered des Parents auf True setzen:

Dazu ein kleines Beispiel:

Delphi-Quellcode:
var Form1: TForm1;
vx: Integer = 1;implementation
{$R *.DFM}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Form1.DoubleBuffered:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Image1.Left:=Image1.Left +vx;
  if Image1.Left>ClientWidth - Image1.Width-1 then vx:=vx*-1;
  if Image1.Left<1 then vx:=vx*-1;
end;
btw.: TImage auf diese Wiese zuverwenden ist nicht gut.

2. Man benutzt ein offscreen Bitmap. Also alles zeichnen erfolgt auf einem Hintergrundbild und wenn alles gezeichnet wurde wird das gesamte Bild auf den "Bildschirm" kopiert.

Delphi-Quellcode:
var Form1: TForm1;
vx: Integer = 1;implementation
Backpuffer: TBitmap;
Bild: TBitmap;
bildleft,bildtop: integer;
{$R *.DFM}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  //Ein Bild erstellen mit der gleichen Grösse wie das Formular
  Backpuffer:= TBitmap.create;
  Backpuffer.width := self.width;
  Backpuffer.height:= self.height;
  Bild:= TBitmap.create;
  Bild.loadfromfile("c:\blabla.bmp");
  Timer1.enable := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Backpuffer.canvas.brush.color := clwhite;
  Backpuffer.canvas.rectangle(0,0,Backpuffer.width,Backpuffer.height)
  
  bildleft:=bildleft+vx;
  if bildleft>ClientWidth - bild.Width-1 then vx:=vx*-1;
  if bildleft<1 then vx:=vx*-1;
  BitBlt(Backpuffer.Canvas.Handle, bildleft, bildtop, Bild.Width, Bild.Height, Bild.canvas.handle, 0, 0, SRCCOPY);//Bild auf Backpuffer kopieren
BitBlt(self.Canvas.Handle, 0, 0, Backpuffer.Width, Backpuffer.Height, Backpuffer.canvas.handle, 0, 0, SRCCOPY);//Backpuffer auf das Formular kopieren
end;
Wie man sieht ist diese Methode etwas aufwendiger allerding verbraucht ein TBItmap weniger Ressorcen als ein TImage und somit ist diese Methode schneller.

3. Verhindern das der Hintergrund gelöscht wird.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure StopFlicker(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
end;

Procedure TForm1.StopFlicker(var Msg: TWMEraseBkgnd);
begin
  Msg.Result := 1;
end;
Das Funktioniert aber nur bei TWinControl bei TGraphiccontrol kann man es mit ControlStyle := [csOpaque] versuchen.

Man kann sich das aber auf sparen indem man nicht die Methoden repaint, invalidate oder vergleichbare benutzt sondern die Methode in der gezeichnet wird direkt aufruft.
  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 06:19 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