Listing 10


//es wird von Bmp1 (Image1) auf Bmp2 (Image2)  entgegen des Uhrzeigersinns überblendet
unit ClockWipe;

interface

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

type TPkt = array[0..361] of TPoint; //Punktarray nimmt Kreispunkte auf

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Button1: TButton;
    procedure FormPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    procedure ClockWipe(re: TRect; Bmp: TBitmap);
    procedure SetPolygonRegion(Pkt: TPkt; PktCount: Integer; Bmp: TBitmap);
    function GetArcPoint(cPoint: TPoint; radius, winkel: Integer): TPoint;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
//erste Bmp (Image1) ausgeben
Canvas.Draw(0, 0, Image1.Picture.Bitmap);
//Überblendung aufrufen
ClockWipe(Image2.Picture.Bitmap.Canvas.ClipRect, Image2.Picture.Bitmap);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
//erste Bmp (Image1) ausgeben
Canvas.Draw(0, 0, Image1.Picture.Bitmap);
end;

procedure TForm1.ClockWipe(re: TRect; Bmp: TBitmap);
var radius, winkel, cv: Integer;
    cP: TPoint;
    Pkt: TPkt;

begin
//Radius des re umschließenden Kreises errechnen
radius:=Round(Sqrt(Sqr((re.right-re.left) div 2) + Sqr((re.bottom-re.top) div 2)));
//Mittelpunkt des re umschließenden Kreises feststellen
cP:=Point((re.right-re.left) div 2, (re.bottom-re.top) div 2);

Pkt[0]:=cP; //Mittelpunkt als ersten Punkt im Polygon setzen

for winkel:=0 to 360 do
   Pkt[winkel+1]:=GetArcPoint(cP, radius, winkel+90); //Punktarray mit Kreisbogenpunkten füllen

//Überblendung starten
for cv:=0 to 361 do
    if (cv-1) / 20 = (cv-1) div 20 then //nur alle 20 Punkte eine Ausgabe ->ges.: 18 Bilder in 900ms = 20 Bilder/s
    begin
    Sleep(50); //50ms warten
    SetPolygonRegion(Pkt, cv+1, Image2.Picture.Bitmap); //Polygon mit entsprechender Punkteanzahl ausgeben
    end;

end;

procedure TForm1.SetPolygonRegion(Pkt: TPkt; PktCount: Integer; Bmp: TBitmap);
var Region: HRGN;

begin
Region:=CreatePolygonRGN(Pkt, PktCount, WINDING); //Region erstellen
if Region <> 0 then
begin
   //ClipRgn im Canvas.handle (HDC) setzen
   SelectClipRgn(Canvas.handle, Region);
   //Bmp2 ausgeben: alles was sich außerhalb der Region befindet wird nicht gezeichnet
   Canvas.Draw(0, 0, Bmp);
   //ursprüngliche ClipRgn wiederherstellen
   SelectClipRgn(Canvas.handle, 0);
  //Region-Object freigeben
   DeleteObject(Region);
end;

end;

//Funktion gibt Punkte auf dem Kreisbogen zurück
function TForm1.GetArcPoint(cPoint: TPoint; radius, winkel: Integer): TPoint;
begin
   result.x:=Round(cPoint.x + radius * Cos(winkel * 2 * pi / 360));
   result.y:=Round(cPoint.y - radius * Sin(winkel * 2 * pi / 360));
end;

end.

Zurück zur Hauptseite