多角形の描画(ポリゴン)         <TOP>


ここでは5角形を描画し、フォームのリサイズに合わせて拡大縮小しています。

CreatePolygonRgn 多角形のリージョンを作成

Polygon 多角形の描画

FillRgn 指定されたブラシによるリージョンの描画

GetStockObject システムで定義されているのペン、ブラシ、フォント、パレット等のハンドルを取得

DeleteObject オブジェクトの削除

 

初期状態

フォームをリサイズ


WindowsXPで動作確認。Windows98・Windows2000ではリサイズ時一瞬描画されるのですがスグ消えてしまいました。^^;;

 

'================================================================
'= 多角形の描画
'=    (Polygon.bas)
'================================================================
#include "Windows.bi"

Type POINTAPI
    x As Long
    y As Long
End Type

' 多角形のリージョンを作成
Declare Function Api_CreatePolygonRgn& Lib "gdi32" Alias "CreatePolygonRgn" (lppt As POINTAPI, ByVal nCount&, ByVal nPolyFillMode&)

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

' 指定のブラシで領域を塗りつぶす
Declare Function Api_FillRgn& Lib "gdi32" Alias "FillRgn" (ByVal hDC&, ByVal hRgn&, ByVal hBrush&)

' ストックオブジェクトのハンドルを取得
Declare Function Api_GetStockObject& Lib "gdi32" Alias "GetStockObject" (ByVal nIndex&)

' ペン、ブラシ、フォント、ビットマップ、リージョン、パレットのいずれかの論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放。オブジェクトを削除した後は、指定されたハンドルは無効になる
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 BLACKBRUSH 4

'================================================================
'=
'================================================================
Declare Sub Form_Paint edecl ()
Sub Form_Paint()
    Var poly(4) As POINTAPI
    Var NumCoords As Long
    Var hBrush As Long
    Var hRgn As Long
    Var hDC As Long
    Var Ret As Long

    Cls
    NumCoords = 5                                               '5角形

    poly(0).x = GetWidth / 2
    poly(0).y = GetHeight / 5
    poly(1).x = GetWidth / 4.5
    poly(1).y = 2 * GetHeight / 4.5
    poly(2).x = GetWidth / 3
    poly(2).y = 3 * GetHeight / 4

    poly(3).x = 3 * GetWidth / 4.5
    poly(3).y = 3 * GetHeight / 4

    poly(4).x = 4 * GetWidth / 5
    poly(4).y = 2 * GetHeight / 4.5

    hDC = Api_GetDC(GethWnd)
    Ret = Api_Polygon(hDC, poly(0), NumCoords)
    hBrush = Api_GetStockObject(BLACKBRUSH)                     '黒のブラシ作成
    hRgn = Api_CreatePolygonRgn(poly(0), NumCoords, ALTERNATE)  '上記カラーでポリゴン作成

    If hRgn Then
        Ret = Api_FillRgn(hDC, hRgn, hBrush)
    End If

    Ret = Api_DeleteObject(hRgn)
    Ret = Api_ReleaseDC(GethWnd, hDC)
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_Resize edecl ()
Sub MainForm_Resize()
    Form_Paint
End Sub

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