領域の塗り潰しのテスト          <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