// Es wird ein Bild mittels "ClockWipe-Effekt" (als wenn ein Uhrzeiger
// schnell über das Bild läuft)
mit einem zweiten überblendet. Im Beispiel
// werden fünf Bilder mit gleichen Abmaßen
(baum1.bmp ... baum5.bmp)
// nacheinander verwendet. Die Variablen
Pause und Grad_Schritt beeinflussen
//
die Geschwindigkeit, allerdings führen zu große Werte zum Ruckeln.
// Mit der Variablen
Innenkeis wird geregelt, ob das ganze Bild oder nur
// ein im Bild eingepasster Kreis bearbeitet wird.
 

Innenkreis
False
Innenkreis
True



// Getestet mit D4 unter XP

type 
 
  Punkte = array[0..361] of TPoint; 
 
  TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure FormPaint(Sender: TObject); 
  private 
    procedure MakeRegion(wP: Integer); 
    function GetPoint(P: TPoint; radius, winkel: Integer): TPoint; 
    procedure doit; 
    procedure loop; 
  public 
    { Public-Deklarationen } 
  end; 
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.DFM} 

const
  Anzahl = 5;

var 
  oben: integer = 10; 
  links: integer = 10; 
  welchesBild: integer = 1; 
  pause: byte = 20; 
  Grad_Schritt: byte = 9; 
  Uhrzeigersinn: boolean = true; 
  Innenkreis: boolean = false; 
  bm: array[0..Anzahl - 1] of TBitmap; 
  wm, sm: integer; 
  Pkt: Punkte; 
 
procedure TForm1.loop; 
begin 
  inc(welchesBild); 
  if welchesBild = Anzahl then welchesBild := 0; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
var 
  x: integer; 
begin 
  inc(Grad_Schritt, ord(Grad_Schritt = 0)); 
  while frac(360 / Grad_Schritt) <> 0 do dec(Grad_Schritt); 
  for x := 0 to Anzahl - 1 do begin 
    bm[x] := TBitmap.create; 
    bm[x].loadfromfile('baum' + inttostr(x + 1) + '.bmp'); 
  end; 
  wm := links + bm[0].width div 2; 
  sm := oben + bm[0].height div 2; 
  Pkt[0] := Point(wm, sm); 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
var 
  x: integer; 
begin 
  for x := 0 to Anzahl - 1 do bm[x].free; 
end; 
 
function TForm1.GetPoint(P: TPoint; radius, winkel: Integer): TPoint; 
begin 
  result.x := Round(P.x + radius * Cos(winkel * pi / 180)); 
  result.y := Round(P.y - radius * Sin(winkel * pi / 180)); 
end; 
 
procedure TForm1.MakeRegion(wP: Integer); 
var 
  Region: HRGN; 
begin 
  Region := CreatePolygonRGN(Pkt, wP, WINDING); 
  if Region <> 0 then begin 
    SelectClipRgn(Canvas.handle, Region); 
    Canvas.Draw(links, oben, bm[welchesBild]); 
    SelectClipRgn(Canvas.handle, 0); 
    DeleteObject(Region); 
  end; 
end; 
 
procedure TForm1.doit; 
var 
  radius, x: Integer; 
  zeit: cardinal; 
begin 
  radius := Round(Sqrt(Sqr(wm) 
    + Sqr(sm)) / (ord(Innenkreis) + 1) - 1); 
  for x := 0 to 360 do 
    Pkt[x + 1] := GetPoint(Pkt[0], radius, 
      x * (ord(not Uhrzeigersinn) * 2 - 1) + 90); 
  for x := 0 to 360 do 
    if x mod Grad_Schritt = 0 then 
    begin 
      zeit := gettickcount + pause; 
      while gettickcount < zeit do begin 
        Application.ProcessMessages; 
        if application.terminated then exit; 
      end; 
      MakeRegion(x + 2); 
    end; 
end; 
 
procedure TForm1.FormPaint(Sender: TObject); 
var 
  i: integer; 
begin 
  if welchesBild = 0 then i := Anzahl - 1 else i := welchesBild - 1; 
  canvas.draw(links, oben, bm[i]); 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if Anzahl < 2 then 
    raise exception.create('Es müssen mindestens zwei Bilder vorhanden sein'); 
  Button1.enabled := false;
  doit; 
  loop; 
  Button1.enabled := true;
end;



Zugriffe seit 6.9.2001 auf Delphi-Ecke