ある領域を塗りつぶし処理は、Visual Basic標準の機能だけでは難しい ものですが、APIを利用すると簡単に行うことができます。使用する関数も ExtFloodFill関数の1つで、特に複雑な引数指定もありません。 塗りつぶし処理をしやすいプロシージャにまとめておきましたので、 使いやすいと思います。
この関数の宣言コードと引数についての説明は以下に示すとおりです。この関数を普通に呼び出しても特に問題ないのですが、塗りつぶす色や 塗りつぶし方はオブジェクトのプロパティで設定するので、その要素も 引数に加えた新たなプロシージャを作成し、処理を一括に行えるように しました。
'塗りつぶし描画API '=========================================================== 'ExtFloodFill ある領域を塗りつぶす '---------引数---------------------------------------------- 'hdc:描画先デバイスコンテキスト 'x,y:塗りつぶし開始座標 'crColor:境界の色、または、塗りつぶす領域の色 'wFillType:塗りつぶし操作の種類、crColorを左右する '=========================================================== Private Declare Function ExtFloodFill Lib "gdi32" _ (ByVal hdc As Long, ByVal x As Long, _ ByVal y As Long, ByVal crColor As Long, _ ByVal wFillType As Long) As Long ' wFillType flags 'crColor で指定した色が囲む範囲を、塗りつぶしの対象とする Private Const FLOODFILLBORDER = 0& 'crColor で指定した色の領域を、塗りつぶしの対象としする。 Private Const FLOODFILLSURFACE = 1&APIはもともとC++言語で利用される関数なので、たった1つの関数を 呼び出す処理でもこのように1度プロシージャに組み込んで、それを 呼び出す方が効率よく利用しやすくなります。
'=========================================================== 'Fill ある領域を塗りつぶすプロシージャ '---------引数---------------------------------------------- 'hdc:描画先オブジェクト 'x1,y1:塗りつぶし開始座標 'sColor:境界の色、または、塗りつぶす領域の色 'FillColor:塗りつぶし色 'FillType:塗りつぶしタイプ 'FillStyle:塗りつぶし方 '=========================================================== Public Function Fill(Pic As Object, x1 As Long, _ y1 As Long, sColor As Long, _ FillColor As Long, FillType As Long, _ FillStyle As Long) As Long Dim oldForeColor As Long '以前の塗りつぶし色 Dim oldFillStyle As Long '以前の塗りつぶしタイプ Dim ret As Long '戻り値 oldForeColor = Pic.ForeColor Pic.FillColor = FillColor '塗りつぶし色を設定 oldFillStyle = Pic.FillStyle Pic.FillStyle = FillStyle '塗りつぶしタイプを設定 ret = ExtFloodFill(Pic.hdc, x1, y1, sColor, FillType) Pic.ForeColor = oldForeColor Pic.FillStyle = oldFillStyle Fill = ret End Function