塗りつぶし



Microsoftペイントである塗りつぶし、ペイントソフトを作る際にはあるといいですよね。
実際塗りつぶしはAPI関数を使えば簡単に出来ます。
十分高速ですので色々な場面でも使う事が出来ると思います。

;同色範囲の塗りつぶし

#include "llmod.as"

#module

#deffunc paint int,int
	mref x,0	;塗りつぶしを開始する座標x
	mref y,1	;塗りつぶしを開始する座標y
	mref bmscr,67

	prm=bmscr.4,bmscr.36
		;bmscr.4はデバイスコンテキストハンドル
		;bmscr.36はcolor命令で設定された色のブラシハンドル
	dllproc "SelectObject",prm,2,D_GDI	;ブラシの割り当て
	hbrush=dllret@	;オリジナルのブラシハンドル

	pget x,y	;開始座標の色取得
	prm=bmscr.4,x,y,(bval<<16)+(gval<<8)+rval,1
		;(bval<<16)+(gval<<8)+rvalは開始座標の色データ
		;最後の1はFLOODFILLSURFACE(色データを塗りつぶし領域の色とする)
	dllproc "ExtFloodFill",prm,5,D_GDI	;塗りつぶし描画

	prm=bmscr.4,hbrush
	dllproc "SelectObject",prm,2,D_GDI	;オリジナルのブラシを戻す
return

#global

	randomize

	screen 0,300,300

	repeat 10	;適当に線を描く
		color 255
		rnd st,winx : rnd en,winx
		line st,-1,en,winy
		rnd st,winy : rnd en,winy
		line -1,st,winx,en
	loop

	onclick *click
	stop

*click
	color ,255
	paint mousex,mousey	;塗りつぶし
	redraw	;再描画
	stop

これを実行すると、ウィンドウにたくさん赤線が引かれています。
ウィンドウのどこかをクリックしてみてください。すると赤線で囲まれた範囲が緑色に塗りつぶされるはずです。
とりあえずこんな動作です。

SelectObject デバイスコンテキストハンドル,オブジェクトハンドル
デバイスコンテキストにオブジェクトを割り当てます。
最終的にはもとのオブジェクトを戻す必要があります。

ExtFloodFill デバイスコンテキストハンドル,開始x座標,y座標,色データ,塗りつぶしタイプ
開始座標から塗りつぶします。

塗りつぶしタイプは、
0(FLOODFILLBORDER)で色データの色を境界線として内側を塗りつぶす
1(FLOODFILLSURFACE)で色データの色を範囲として塗りつぶす

というところでしょうか…。

(bval<<16)+(gval<<8)+rval
この計算式は、APIなどで扱えるデータに変換しています。
16進数で表せば、$00BBGGRRという感じです。



戻る