Material OOP Grundlagen Delphi Software-Technik Bonsai Digitaltechnik Ereignisse Grafik UML Netze Fischertechnik Tipps Werkzeuge Literatur Automaten Sprachen Datenbanken XML Prolog Berechenbarkeit
Pfad: Startseite / Fächer / Informatik / Material
Autor: mk
03.03.2004 18:30
3083
Grafik

DoubleBuffering

Vor allem bei bewegter Grafik stellt man oft ein unschönes Flackern fest. Man kann dieses Flackern vermeiden, wenn man die Grafik verdeckt erzeugt und dann schlagartig anzeigt.
  .....
  
  // 1. Referenzvariable vereinbaren
  buffer     : TBitMap;

  .....
  
  // 2. BitMap-Objekt erzeugen, Größe setzen 
  buffer := TBitMap.Create;
  buffer.Width := 400; buffer.Height := 300; // auf Verzerrungen achten

  ......
  
  // 3. in den Puffer zeichnen
  with buffer.Canvas do ...

  ......
  
  // 4. Puffer anzeigen 
  Canvas.Draw(0,0,buffer);

  ......
  
  // 5. Objekt freigeben
  buffer.Free;

  ......

ohne Double-Buffering:


Download des Projekts:Wanderlinie1.zip

unit uWander1; { mk, 23.4.03 }

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    x,y1,y2,dx : integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // an alter Stelle löschen, dh. mit Hintergrundfarbe zeichnen
  Canvas.Pen.Color := clBtnFace; Canvas.MoveTo(x,y1); Canvas.LineTo(x,y2);
  // neues x bestimmen
  if (x > width-20) or (x < 10) then dx := -dx;
  x := x + dx;
  // an neuer Stelle mit Vordergrundfarbe zeichnen
  Canvas.Pen.Color := clRed; Canvas.MoveTo(x,y1); Canvas.LineTo(x,y2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  x := 10; y1 := 20; y2 := 120; dx := +1;
  Canvas.Pen.width := 20; Canvas.MoveTo(x,y1); Canvas.LineTo(x,y2);
end;

end.


mit Double-Buffering:


Download des Projekts:Wanderlinie2.zip

unit uWander2; { mk, 23.4.03 }

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    x,y1,y2,dx : integer;
    // 1. Referenzvariable vereinbaren
    buffer     : TBitMap; 
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // 3. Puffer verändern
  with buffer.Canvas do 
  begin
    // an alter Stelle löschen, dh. mit Hintergrundfarbe zeichnen
    Pen.Color := clBtnFace; MoveTo(x,y1); LineTo(x,y2);
    // neues x bestimmen
    if (x > width-20) or (x < 10) then dx := -dx; x := x + dx;
    // an neuer Stelle mit Vordergrundfarbe zeichnen
    Pen.Color := clRed; MoveTo(x,y1); LineTo(x,y2);
  end;
  // 4. Puffer anzeigen
  Canvas.Draw(0,0,buffer); 
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  x := 10; y1 := 20; y2 := 120; dx := +1;
  // 2. BitMap-Objekt erzeugen, Größe setzen
  buffer := TBitMap.Create; buffer.Width := Width; buffer.Height := Height;
  // 3. in den Puffer zeichnen
  with buffer.Canvas do
  begin
    Pen.width := 20;
    Brush.Color := clBtnFace; FillRect(Rect(0,0,width-1,height-1));
    MoveTo(x,y1); LineTo(x,y2);
  end;
  // 4. Puffer anzeigen
  Canvas.Draw(0,0,buffer);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // 5. Objekt freigeben
  buffer.Free;  
end;

end.