領域の塗り潰しのテスト <TOP>
指定領域内を塗り潰すテスト
ExtFloodFill 塗り潰しの指定
FloodFill 塗り潰しの指定(Win32アプリケーションでは、ExtFloodFill関数を使う)
CreateSolidBrush 塗り潰し指定
CreateHatchBrush ハッチ指定
SelectObject グラフィックオブジェクトをデバイスコンテキストと関連付ける
DeleteObject オブジェクトの削除
GetDC フォームのデバイスコンテキスト取得
ReleaseDC フォームのデバイスコンテキスト解放
フォームにRadioButtonを6個、Buttonを1個貼り付けます。Radio1〜Radio5のイベントは全てRadioOpl_ONとします。
適当な図形をプログラム上で描画します。
マウス左ボタンをクリックすると、色設定ダイアログボックスで指定した色で塗り潰し、右ボタンをクリックするとラジオボタンで選択した種類のハッチ(青)で塗り潰しを実行します。
'================================================================ '= 塗り潰しのテスト '= (ExtFloodFill.bas) '================================================================ #include "Windows.bi" ' 現在選択されているブラシで一定の範囲内を塗りつぶす Declare Function Api_ExtFloodFill& Lib "gdi32" Alias "ExtFloodFill" (ByVal hDC&, ByVal X&, ByVal Y&, ByVal crColor&, ByVal wFillType&) ' 画面の領域を現在のブラシで塗りつぶ(Win32 アプリケーションでは、ExtFloodFill 関数を使う) Declare Function Api_FloodFill& Lib "gdi32" Alias "FloodFill" (ByVal hDC&, ByVal x&, ByVal y&, ByVal crColor&) ' ソリッドカラーで論理ブラシを作成 Declare Function Api_CreateSolidBrush& Lib "gdi32" Alias "CreateSolidBrush" (ByVal crColor&) ' ハッチパターンの論理ブラシを作成 Declare Function Api_CreateHatchBrush& Lib "gdi32" Alias "CreateHatchBrush" (ByVal nIndex&, ByVal crColor&) ' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得 Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) ' 指定されたデバイスコンテキストのオブジェクトを選択 Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&) ' ペン、ブラシ、フォント、ビットマップ、リージョン、パレットのいずれかの論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放。オブジェクトを削除した後は、指定されたハンドルは無効になる Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&) #define FLOODFILLBORDER 0 '塗りつぶし領域がcrColorで指定された色に囲まれている範囲 #define FLOODFILLSURFACE 1 'crColorで指定された色の領域(指定色がある限り塗りつぶし) #define HS_HORIZONTAL 0 '水平ハッチ #define HS_VERTICAL 1 '垂直ハッチ #define HS_FDIAGONAL 2 '45度下向きのハッチ (左から右へ) #define HS_BDIAGONAL 3 '45度上向き(左から右へ) #define HS_CROSS 4 '水平と垂直クロスハッチ #define HS_DIAGCROSS 5 '45度のクロスハッチ Var Shared Flag As byte Var Shared Hatch As byte Var Shared rgbColor As Long '================================================================ '= とりあえず描画 '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Circle(60, 60), 50, 0 Circle(220, 60), 100, 0, .5 Circle(220, 100), 60, 0, 1.5 Circle(60, 160), 20, 0 Line(30, 40)-(90, 80), Pset, 0, b Line(10, 120)-(120, 200), Pset, 0, b Line(130, 120)-(250, 200), Pset, 0, b Line(160, 145)-(320, 175), Pset, 0, b Hatch = HS_BDIAGONAL rgbColor = RGB(255, 0, 0) End Sub '================================================================ '= ハッチ種類取得 '================================================================ Declare Sub RadioOpl_on edecl () Sub RadioOpl_on() Var Radio As Object Radio.Attach GetFocus Select Case Radio.GetWindowText Case "0" Hatch = HS_HORIZONTAL Case "1" Hatch = HS_VERTICAL Case "2" Hatch = HS_FDIAGONAL Case "3" Hatch = HS_BDIAGONAL Case "4" Hatch = HS_CROSS Case "5" Hatch = HS_DIAGCROSS End Select End Sub '================================================================ '= 塗り潰し '================================================================ Declare Sub MainForm_MouseDown edecl (ByVal Button%, ByVal Shift%, ByVal SX!, ByVal SY!) Sub MainForm_MouseDown(ByVal Button%, ByVal Shift%, ByVal SX!, ByVal SY!) Var Ret As Long Var hBr As Long Var hDC As Long hDC = Api_GetDC(GethWnd) 'MainFormのデバイスコンテキスト取得 If Button% = 1 Then hBr = Api_CreateSolidBrush(rgbColor) '塗りつぶし指定 Else hBr = Api_CreateHatchBrush(Hatch, RGB(0, 0, 255)) 'ハッチ指定 End If Ret = Api_SelectObject(hDC, hBr) Ret = Api_ExtFloodFill(hDC, SX, SY, 0, FLOODFILLBORDER) '塗りつぶし ' Ret = Api_FloodFill(hDC, SX, SY, FLOODFILLBORDER) '塗りつぶし Ret = Api_DeleteObject(hBr) 'ブラシの解放 Ret = Api_ReleaseDC(hBr, hDC) 'デバイスコンテキストの解放 End Sub '================================================================ '= 塗り潰し色変更 '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() If ChooseColor(rgbColor) Then SetFillColor rgbColor End If End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End