16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"リージョンの変形フォームでアニメーション"
この発言に対し以下のコメントが寄せられています
#00336 YSS(原 靖) さん RE:リージョンの変形フォームでアニメーシ
128×32のビットマップから32×32のリージョンを4つ生成し、
それを使用して次々にフォームの形状を切り変えていきます。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClick(Sender: TObject);
private
{ Private 宣言 }
RgnArray: array[0..3] of HRgn;
Rgn: HRgn;
Bmp: TBitmap;
Pat: Byte;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
i, x, y: Integer;
RectKaz: Integer;
RectArray: array[0..1023] of TRect;
RgnData: PRgnData;
DataSize: Integer;
begin
Self.BorderStyle := bsNone;
Self.Width := 32;
Self.Height := 32;
Bmp := TBitmap.Create;
Bmp.LoadFromFile('128×32のビットマップ.bmp');
Rgn := CreateRectRgn(0, 0, 32, 32);
Pat := 0;
for i := 0 to 3 do
begin
RectKaz := 0;
for y := 0 to 31 do
begin
for x := 0 to 31 do
begin
//黒を透明にする
if Bmp.Canvas.Pixels[x + i*32, y] <> 0 then
begin
RectArray[RectKaz] := Rect(x, y, x+1, y+1);
Inc(RectKaz);
end;
end;
end;
//リージョンの作成
DataSize := SizeOf(TRgnDataHeader)+RectKaz*SizeOf(TRect);
RgnData := AllocMem(DataSize);
with RgnData^ do
begin
rdh.dwSize := SizeOf(TRGNDATAHEADER);
rdh.iType := RDH_RECTANGLES;
rdh.nCount := RectKaz;
rdh.nRgnSize := SizeOf(TRect)*RectKaz;
rdh.rcBound := Rect(0, 0, 32, 32);
Move(RectArray,Buffer,SizeOf(TRect)*RectKaz);
end;
RgnArray[i] := ExtCreateRegion(Nil, DataSize, RgnData^);
FreeMem(RgnData);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
Bmp.Free;
DeleteObject(Rgn);
for i := 0 to 3 do
DeleteObject(RgnArray[i]);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
NewRgn: HRgn;
begin
//リージョンを変更
NewRgn := CreateRectRgn(0,0,1,1);
CombineRgn(NewRgn,RgnArray[Pat],0,RGN_COPY);
SetWindowRgn(Self.Handle, NewRgn, True);
Self.Canvas.CopyRect(Rect(0,0,32,32), Bmp.Canvas,
Rect(Pat*32, 0, Pat*32 + 32, 32));
DeleteObject(Rgn);
Rgn := NewRgn;
Pat := (Pat+1) mod 4;
end;
procedure TForm1.FormClick(Sender: TObject);
begin
//フォームをクリックすると終了
Close;
end;
end.
98/1/10(Sat) 11:20pm VZF11362 YSS
Original document by YSS 氏 ID:(VZF11362)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|