多角形の塗り潰し <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