//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;