お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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