クリッピング領域とパスを結合(U)          <TOP>


CreateFontIndirect 論理フォントを作成
TextOut テキストを指定の位置に出力
SetPolyFillMode 多角形塗りつぶしモードを設定

CreatePen 論理ペンを作成

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

BeginPath 指定されたデバイスコンテキストのパスを指定

MoveToEx 現在位置を受け取るバッファを参照で指定

LineTo 現在の位置から終点までを直線で描画

EndPath パスの作成を終了

SelectClipPath 指定したデバイスコンテキストのクリッピング領域とパスを結合

WidenPath パスを塗りつぶしの対象領域として再定義

SetBkMode バックグラウンドの塗りつぶしモード設定
DeleteObject
システムリソースの解放

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

ReleaseDC デバイスコンテキストのハンドルを解放

 

 

'================================================================
'= クリッピング領域とパスを結合(U)
'=    (SelectClipPath2.bas)
'================================================================
#include "Windows.bi"

#define LF_FACESIZE 32

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

Type LOGFONT
    lfHeight         As Long
    lfWidth          As Long
    lfEscapement     As Long
    lfOrientation    As Long
    lfWeight         As Long
    lfItalic         As Byte
    lfUnderline      As Byte
    lfStrikeOut      As Byte
    lfCharSet        As Byte
    lfOutPrecision   As Byte
    lfClipPrecision  As Byte
    lfQuality        As Byte
    lfPitchAndFamily As Byte
    lfFaceName(LF_FACESIZE) As Byte
End Type

' 論理フォントを作成
Declare Function Api_CreateFontIndirect& Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT)

' パスをクリッピング領域に設定
Declare Function Api_SelectClipPath& Lib "gdi32" Alias "SelectClipPath" (ByVal hDC&, ByVal iMode&)

' hDCで指定されたデバイスコンテキストのパスの作成
Declare Function Api_BeginPath& Lib "gdi32" Alias "BeginPath" (ByVal hDC&)

' BeginPathで開始したパスの作成を終了
Declare Function Api_EndPath& Lib "gdi32" Alias "EndPath" (ByVal hDC&)

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

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

' テキストを指定の位置に出力
Declare Function Api_TextOut& Lib "gdi32" Alias "TextOutA" (ByVal hDC&, ByVal nXStart&, ByVal nYStart&, ByVal lpString$, ByVal cbString&)

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

' 多角形塗りつぶしモードを設定
Declare Function Api_SetPolyFillMode& Lib "gdi32" Alias "SetPolyFillMode" (ByVal hDC&, ByVal nPolyFillMode&)

' 論理ペンを作成
Declare Function Api_CreatePen& Lib "gdi32" Alias "CreatePen" (ByVal nPenStyle&, ByVal nWidth&, ByVal crColor&)

' 現在位置を受け取るバッファを参照で指定
Declare Function Api_MoveToEx& Lib "gdi32" Alias "MoveToEx" (ByVal hDC&, ByVal x&, ByVal y&, ByVal lpPoint&)

' 現在の位置から終点までを直線で描画
Declare Function Api_LineTo& Lib "gdi32" Alias "LineTo" (ByVal hDC&, ByVal x&, ByVal y&)

' 論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放
Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&)

' 指定されたデバイスコンテキストの現在ペンを使ってパスが描かれている場合、そのパスを塗りつぶしの対象領域として再定義
Declare Function Api_WidenPath& Lib "gdi32" Alias "WidenPath" (ByVal hDC&)

' バックグラウンドの塗りつぶしモード設定
Declare Function Api_SetBkMode& Lib "gdi32" Alias "SetBkMode" (ByVal hDC&, ByVal iBkMode&)

#define TRANSPARENT 1                   '背景色を設定しない
#define RGN_COPY 5                      'HRGNSRC1のコピーを作成
#define WINDING 2                       '全域塗りつぶしモード
#define PS_SOLID 0                      '実線のペンを作成
#define vbWhite &HFFFFFF                '白のカラーコード
#define vbBlack &H000000                '黒のカラーコード
#define vbRed &H0000FF                  '赤のカラーコード
#define DT_CALCRECT &H400               'テキストを表示するために必要な長方形の大きさをlpRectパラメータに格納

Var Shared Button1 As Object

Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var rc As RECT
    Var lf As LOGFONT
    Var rFont As Long
    Var hDC As Long
    Var hPen As Long
    Var hOldPen As Long
    Var i As Long
	Var txt As String
    Var Ret As Long

    SetFontName "MS 明朝"
    txt = "札幌市白石区"

    lf.lfHeight = 60
    lf.lfWeight = 400
    lf.lfCharSet = 128

    rFont = Api_CreateFontIndirect(lf)

    hDC = Api_GetDC(GethWnd)
    Ret = Api_SetPolyFillMode(hDC, WINDING)

    'パス用ペンを設定
    hPen = Api_CreatePen(PS_SOLID, 1, vbBlack)
    hOldPen = Api_SelectObject(hDC, rFont)
    Ret = Api_SetBkMode(hDC, TRANSPARENT)

    '通常の文字列描画
    Ret = Api_TextOut(hDC, 10, 5, txt, Len(txt))

    'パスブラケットをオープン
    Ret = Api_BeginPath(hDC)
    Ret = Api_TextOut(hDC, 10, 70, txt, Len(txt))
    Ret = Api_EndPath(hDC)

    Ret = Api_WidenPath(hDC)

    'クリッピング領域とパスを結合
    Ret = Api_SelectClipPath(hDC, RGN_COPY)

    'オブジェクトを選択
    Ret = Api_SelectObject(hDC, hOldPen)

    'パス用ペンを設定
    hPen = Api_CreatePen(PS_SOLID, 1, vbBlack)
    hOldPen = Api_SelectObject(hDC, hPen)

    For i = 71 To 129
        Ret = Api_MoveToEx(hDC, 11, i, 0)
        Ret = Api_LineTo(hDC, 370, i)
    Next

    '論理オブジェクトを削除
    Ret = Api_DeleteObject(hPen)

    'デバイスコンテキストを解放
    Ret = Api_ReleaseDC(GethWnd, hDC)
End Sub

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