Как сделать wipe эффект |
Previous Top Next |
Code: |
unit ClockWipe;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TPkt = array[0..361] of TPoint;
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 Declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin Canvas.Draw(0, 0, Image1.Picture.Bitmap); ClockWipe(Image2.Picture.Bitmap.Canvas.ClipRect, Image2.Picture.Bitmap); end;
procedure TForm1.FormPaint(Sender: TObject); begin 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 := Round(Sqrt(Sqr((re.right - re.left) div 2) + Sqr((re.bottom - re.top) div 2))); cP := Point((re.right - re.left) div 2, (re.bottom - re.top) div 2); Pkt[0] := cP; for winkel := 0 to 360 do Pkt[winkel + 1] := GetArcPoint(cP, radius, winkel + 90); for cv := 0 to 361 do if (cv - 1) / 20 = (cv - 1) div 20 then begin Sleep(50); SetPolygonRegion(Pkt, cv + 1, Image2.Picture.Bitmap); end; end;
procedure TForm1.SetPolygonRegion(Pkt: TPkt; PktCount: Integer; Bmp: TBitmap); var Region: HRGN; begin Region := CreatePolygonRGN(Pkt, PktCount, WINDING); if Region <> 0 then begin SelectClipRgn(Canvas.handle, Region); Canvas.Draw(0, 0, Bmp); SelectClipRgn(Canvas.handle, 0); DeleteObject(Region); end; end;
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. |
©Drkb::03892
Взято с Delphi Knowledge Base: http://www.baltsoft.com/