お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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