クリッピング領域の設定          <TOP>


クリッピング領域を新たに設定します。

SetRect RECT構造体の値を設定

IntersectClipRect 指定したデバイスコンテキストのクリッピング領域と、指定した長方形が重なる部分を新しいクリッピング領域に設定

DrawEdge 矩形に3D効果を与える

SelectClipRgn クリッピング領域を設定

FillRect ブラシで矩形領域を塗り潰す

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

Ellippse 楕円の描画

GetDC デバイスコンテキストのハンドルを取得

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

 

例では、「SetRect」をクリックした場合は、指定した領域に指定したサイズで描画。

「実行」をクリックした場合は、IntersectClipRectで指定された領域にクリップされた状態を表しています。

 

'================================================================
'= クリッピング領域の設定
'=    (IntersectClipRect.bas)
'================================================================
#include "Windows.bi"

Type RECT
    Left   As Long
    Top    As Long
    Right  As Long
    Bottom As Long
End Type

#define BF_BOTTOM &H8                   '下辺を描画
#define BF_LEFT &H1                     '左辺を描画
#define BF_RECT (&H1 Or &H2 Or &H4 Or &H8) '(BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)
#define BF_RIGHT &H4                    '右辺を描画
#define BF_TOP &H2                      '上辺を描画
#define BF_MIDDLE &H800                 ' Fill in the middle.
#define BDR_INNER &HC                   '
#define BDR_OUTER &H3                   '
#define BDR_RAISED &H5                  '
#define BDR_RAISEDINNER &H4             '内側が凸
#define BDR_RAISEDOUTER &H1             '外側エッジが凸
#define BDR_SUNKEN &HA                  '
#define BDR_SUNKENINNER &H8             '内側が凹
#define BDR_SUNKENOUTER &H2             '外側エッジが凹
#define EDGE_RAISED (&H1 Or &H4)        '(BDR_RAISEDOUTER Or BDR_RAISEDINNER)

' RECT構造体の値を設定
Declare Function Api_SetRect& Lib "user32" Alias "SetRect" (lpRect As RECT, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)

' 指定したデバイスコンテキストのクリッピング領域と、指定した長方形が重なる部分を、新しいクリッピング領域に設定
Declare Function Api_IntersectClipRect& Lib "gdi32" Alias "IntersectClipRect" (ByVal hDC&, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)

' 矩形に3D効果を与える
Declare Function Api_DrawEdge& Lib "user32" Alias "DrawEdge" (ByVal hDC&, qrc As RECT, ByVal edge&, ByVal grfFlags&)

' クリッピング領域を設定
Declare Function Api_SelectClipRgn& Lib "gdi32" Alias "SelectClipRgn" (ByVal hDC&, ByVal hRgn&)

' ブラシで矩形領域を塗りつぶす
Declare Function Api_FillRect& Lib "user32" Alias "FillRect" (ByVal hDC&, ByRef r As RECT, ByVal hBrush&)

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

' 楕円の描画
Declare Function Api_Ellipse& Lib "gdi32" Alias "Ellipse" (ByVal hDC&, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)

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

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

'================================================================
'= 新しいクリッピング領域
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var rct1 As RECT
    Var rct2 As RECT
    Var hDC As Long
    Var Ret As Long

    hDC = Api_GetDC(GethWnd)

    Cls

    Ret = Api_IntersectClipRect(hDC, 20, 10, 130, 95)

    rct1.Right = GetWidth
    rct1.Bottom = GetHeight
    Ret = Api_FillRect(hDC, rct1, Api_CreateSolidBrush(255))

    Ret = Api_Ellipse(hDC, 50, 60, 200, 190)

    rct2.Left = 70
    rct2.Top = 5
    rct2.Right = 200
    rct2.Bottom = 50
    Ret = Api_DrawEdge(hDC, rct2, EDGE_RAISED, BF_RECT Or BF_MIDDLE)

    Ret = Api_SelectClipRgn(hDC, 0)
    Ret = Api_ReleaseDC(GethWnd, hDC)
End Sub

'================================================================
'= 通常領域
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var rct1 As RECT
    Var rct2 As RECT
    Var hDC As Long
    Var Ret As Long

    hDC = Api_GetDC(GethWnd)

    Cls

    rct1.Right = GetWidth
    rct1.Bottom = GetHeight
    Ret = Api_SetRect(rct1, 20, 10, 130, 95)
    Ret = Api_FillRect(hDC, rct1, Api_CreateSolidBrush(255))

    Ret = Api_Ellipse(hDC, 50, 60, 200, 190)

    rct2.Left = 70
    rct2.Top = 5
    rct2.Right = 200
    rct2.Bottom = 50
    Ret = Api_DrawEdge(hDC, rct2, EDGE_RAISED, BF_RECT Or BF_MIDDLE)

    Ret = Api_SelectClipRgn(hDC, 0)
    Ret = Api_ReleaseDC(GethWnd, hDC)
End Sub

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