多角形の描画(ポリゴン) <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