多角形の塗り潰し          <TOP>


多角形(★)を描画し塗り潰します。

SetPolyFillMode 多角形塗りつぶしモードを設定

GetPolyFillMode 多角形塗りつぶしモードを取得

Polygon 直線により接続された2つ以上の頂点からなっているポリゴンを引く

CreateSolidBrush ソリッドカラーで論理ブラシを作成

SelectObject 指定されたデバイスコンテキストのオブジェクトを選択

DeleteObject オブジェクトの削除

GetDC デバイスコンテキストの取得

ReleaseDC デバイスコンテキストを解放

 

例では左側の★はWINDING指定、右側の★はALTERNATE指定で塗り潰しています。

 

'================================================================
'= 多角形の塗り潰し
'=    (SetPolyFillMode.bas)
'================================================================
#include "Windows.bi"

Type POINTAPI
    x As Long
    y As Long
End Type

' 多角形塗りつぶしモードを設定
Declare Function Api_SetPolyFillMode& Lib "gdi32" Alias "SetPolyFillMode" (ByVal hDC&, ByVal nPolyFillMode&)

' 多角形塗りつぶしモードを取得
Declare Function Api_GetPolyFillMode& Lib "gdi32" Alias "GetPolyFillMode" (ByVal hDC&)

' 直線により接続された2つ以上の頂点から成っているポリゴンを引く
Declare Function Api_Polygon& Lib "gdi32" Alias "Polygon" (ByVal hDC&, lpPoint As Any, ByVal nCount&)

' ソリッドカラーで論理ブラシを作成
Declare Function Api_CreateSolidBrush& Lib "gdi32" Alias "CreateSolidBrush" (ByVal crColor&)

' 指定されたデバイスコンテキストのオブジェクトを選択
Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&)

' ペン、ブラシ、フォント、ビットマップ、リージョン、パレットのいずれかの論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放。オブジェクトを削除した後は、指定されたハンドルは無効になる
Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

#define ALTERNATE 1                     '交差したリージョンは塗らない
#define WINDING 2                       '交差したリージョンも塗る
#define FLOODFILLBORDER 0               '塗りつぶし領域がcrColorで指定された色に囲まれている範囲

Var Shared Text1 As Object
Var Shared Button1 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 12
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var papi(4) As POINTAPI
    Var hDC As Long
    Var rgbColor As Long
    Var hBrush As Long
    Var i As Integer
    static StarWidth As Long

    'デバイスコンテキストを取得
    hDC = Api_GetDC(GethWnd)

    '★の幅を設定
    StarWidth = 150

    '塗り潰し色を赤に設定
    rgbColor = RGB(255, 0, 0)

    '左側の★のポイントを設定
    papi(0).x = StarWidth / 2
    papi(0).y = 5
    papi(1).x = StarWidth / 5 * 4
    papi(1).y = StarWidth + 5
    papi(2).x = 0
    papi(2).y = StarWidth / 3 + 5
    papi(3).x = StarWidth
    papi(3).y = StarWidth / 3 + 5
    papi(4).x = StarWidth / 5
    papi(4).y = StarWidth + 5

    '塗りつぶし指定
    hBrush = Api_CreateSolidBrush(rgbColor)

    'オブジェクトを選択
    Ret = Api_SelectObject(hDC, hBrush)

    'FillModeがWINDINGでなければWINDINGに設定
    If Api_GetPolyFillMode(hDC) <> WINDING Then Ret = Api_SetPolyFillMode(hDC, WINDING)

    'ポリゴン描画
    Ret = Api_Polygon(hDC, papi(0), 5)

    '右側の★のポイントを設定
    For i = 0 To 4
        papi(i).x = papi(i).x + StarWidth + 15
    Next

    'FillModeをALTERNATEに設定
    Ret = Api_SetPolyFillMode(hDC, ALTERNATE)

    '右側の★を描画
    Ret = Api_Polygon(hDC, papi(0), 5)

    Text1.ShowWindow -1

    'デバイスコンテキストを解放・ブラシの解放
    Ret = Api_ReleaseDC(GethWnd, hDC)
    Ret = Api_ReleaseDC(hBrush, hDC)
    Ret = Api_DeleteObject(hBrush)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End