|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"BITMAPを元にフォームの形を作る"
// 不定形なフォームの作成にBITMAPを利用する例です。
// この関数が返すリージョンのハンドルをSetWindowRgnに使用してく
// ださい。
// srcbmp はくり抜きの型になるBITMAPです。(0,0)の点の色が、透け
// る部分になります。
// ofsx,ofsy はリージョン作成時のスタート座標のオフセットです。
// (0,0)はタイトルバーの左上(!)になるので注意してください
function TForm1.MakeBMPtoRgn(srcbmp:TBitmap; ofsx,ofsy:integer):HRgn;
var
i,j,sx : integer;
skipcol : TColor;
NowSearch : boolean;
begin
WITH canvas DO BEGIN
Brush.style:=bsClear;
skipcol:=srcbmp.canvas.pixels[0,0]; // (0,0)の色を透過色として設定
NowSearch:=false;
BeginPath(handle);
FOR j:=0 TO srcbmp.Height-1 DO BEGIN
// 横方向にスキャンする
FOR i:=0 TO srcbmp.Width-1 DO BEGIN
IF NowSearch THEN BEGIN
IF srcbmp.canvas.Pixels[i,j]=skipcol THEN BEGIN // 描画範囲確定
PolyLine([Point(sx+ofsx,j+ofsy),
Point(i+ofsx,j+ofsy),Point(i+ofsx,j+1+ofsy)]);
NowSearch:=false;
END;
END ELSE BEGIN
IF srcbmp.canvas.Pixels[i,j]<>skipcol THEN BEGIN // 描画範囲開始
sx:=i;
NowSearch:=true;
END;
END;
END;
// searchのまま終了 → 最後まで描画範囲だった
IF NowSearch THEN BEGIN
NowSearch:=false;
PolyLine([Point(sx+ofsx,sy+ofsy),Point(srcbmp.width+ofsx,j+ofsy),
Point(srcbmp.width+ofsx,j+1+ofsy)]);
END;
END;
Endpath(handle);
result:=PathToRegion(Handle);
END;
end;
この処理は、むちゃくちゃ重いです。これを使ってのアニメーションはやらない方が
いいです。もっと効率の良いアプローチを探しましょう:-)
この関数では横方向にスキャンしていますが、これを縦方向に変更した場合、NTで
はまともに描画されますが、95では無茶苦茶になります(ServicePack1とOSR2.0で
確認済み)。
市丸 剛(HGD00106)
Original document by 市丸 剛 氏 ID:(HGD00106)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|