16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:リージョンの変形フォームでアニメーシ"
この発言は #00330 YSS さんのリージョンの変形フォームでアニメーション に対するコメントです
nifty:FDELPHI/MES/09/2472 の 村上 正行さんの発言を参考にさせて
いただき、少し修正しました。
2つのウィンドウを交互に表示させる事で、残像が残りにくくなりました。
新規プロジェクトにフォームを追加し、自動生成の対象から外してください。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
ExtCtrls, Unit2;
type
TChara = record
Form: TForm2;
Rgn: HRgn;
end;
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;
Chara: array[0..1] of TChara;
Bmp: TBitmap;
Pat: Byte;
Frg: Byte;
CharLeft: Integer;
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
CharLeft := 0;
Bmp := TBitmap.Create;
Bmp.LoadFromFile('128×32のビットマップ.bmp');
Pat := 0;
Frg := 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;
//キャラ用フォーム生成
for i := 0 to 1 do
begin
Chara[i].Form := TForm2.Create(Self);
Chara[i].Form.BorderStyle := bsNone;
Chara[i].Form.Width := 32;
Chara[i].Form.Height := 32;
Chara[i].Rgn := CreateRectRgn(0, 0, 1, 1);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
Bmp.Free;
for i := 0 to 3 do
DeleteObject(RgnArray[i]);
for i := 0 to 1 do
begin
Chara[i].Form.Free;
DeleteObject(Chara[i].Rgn);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
NewRgn: HRgn;
begin
//表示位置を2ドットずらす
Inc(CharLeft, 2);
Chara[Frg].Form.Left := CharLeft;
//リージョンを変更
NewRgn := CreateRectRgn(0,0,1,1);
CombineRgn(NewRgn,RgnArray[Pat], 0, RGN_COPY);
SetWindowRgn(Chara[Frg].Form.Handle, NewRgn, True);
DeleteObject(Chara[Frg].Rgn);
Chara[Frg].Rgn := NewRgn;
//ウィンドウを切り替える
ShowWindow(Chara[Frg].Form.Handle, SW_SHOWNA);
Chara[Frg].Form.Canvas.CopyRect(Rect(0,0,32,32), Bmp.Canvas,
Rect(Pat*32, 0, Pat*32 + 32, 32));
ShowWindow(Chara[1 - Frg].Form.Handle, SW_HIDE);
Pat := (CharLeft div 20) mod 4;
Frg := 1 - Frg;
end;
procedure TForm1.FormClick(Sender: TObject);
begin
//フォームをクリックすると終了
Close;
end;
end.
98/1/12(Mon) 11:26pm VZF11362 YSS
Original document by YSS(原 靖) 氏 ID:(VZF11362)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|