角の丸い矩形を描画(U)          <TOP>


ピクチャボックスに角の丸い長方形を描画してみます。

RoundRect 角の丸い矩形を描画

GetDC 指定されたウィンドウのデバイスコンテキストを取得

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

CreateBrushIndirect LOGBRUSH構造体を定義して論理ブラシを作成

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

DeleteObject オブジェクトを削除

 

例では、ピクチャボックスの中央に角の丸み(半径を)変えながらハッチングスタイルで描画しています。

 

'================================================================
'= 角の丸い矩形を描画(U)
'=    (RoundRect2.bas)
'================================================================
#include "Windows.bi"

Type LOGBRUSH
    lbStyle As Long
    lbColor As Long
    lbHatch As Long
End Type

#define HS_BDIAGONAL 3                  '斜線(左上-右下)
#define HS_CROSS 4                      '水平と垂直クロスハッチ
#define HS_DIAGCROSS 5                  '45度のクロスハッチ
#define HS_FDIAGONAL 2                  '45度下向きのハッチ(左から右へ)
#define HS_HORIZONTAL 0                 '水平ハッチ
#define HS_VERTICAL 1                   '垂直ハッチ

#define BS_HATCHED 2                    'ハッチング(スタイルはlbHatchで指定)

' 角の丸い矩形を描画
Declare Function Api_RoundRect& Lib "gdi32" Alias "RoundRect" (ByVal hDC&, ByVal nLeftRect&, ByVal nTopRect&, ByVal nRightRect&, ByVal nBottomRect&, ByVal nWidth&, ByVal nHeight&)

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

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

' LOGBRUSH構造体を定義して論理ブラシを作成
Declare Function Api_CreateBrushIndirect& Lib "gdi32" Alias "CreateBrushIndirect" (lpLogBrush As LOGBRUSH)

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

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

Var Shared Picture1 As Object
Picture1.Attach GetDlgItem("Picture1")

'================================================================
'=
'================================================================
Declare Function HS bdecl () As Integer
Function HS()
    HS = Val(Mid$(GetDlgRadioSelect("Radio1"), 6)) - 1
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hDC As Long
    Var lb As LOGBRUSH
    Var Radius As Integer
    Var hNewBrush As Long
    Var hOldBrush As Long
    Var Ret As Long

    lb.lbStyle = BS_HATCHED
    lb.lbColor = RGB(Int(Rnd(1) * 255), Int(Rnd(1) * 255), Int(Rnd(1) * 255))
    lb.lbHatch = HS

    hDC = Api_GetDC(Picture1.GethWnd)
    Picture1.SetBackColor RGB(255, 128, 64)
    hNewBrush = Api_CreateBrushIndirect(lb)
    Ret = Api_SelectObject(hDC, hNewBrush)

    For radius = 0 To 100 Step 5
        Picture1.Cls
        Ret = Api_RoundRect(hDC, 10, 10, Picture1.GetWidth - 10 , Picture1.GetHeight - 10, Radius, Radius)
        Wait 30
    Next

    Ret = Api_SelectObject(hDC, hOldBrush)
    Ret = Api_DeleteObject(nNewBrush)
    Ret = Api_ReleaseDC(Picture1.GethWnd, hDC)
End Sub

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