デバイスコンテキストの状態保存と復元(T)          <TOP>


SaveDC 指定のデバイスコンテキストの現在の状態を保存

RestoreDC SaveDCで保存したデバイスコンテキストを復元

CreatePen 論理ペンを作成

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

Rectangle 長方形の描画

DeleteObject 論理オブジェクトを削除し、関連システムリソースを解放

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

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

 

例では、最初太い赤実線で枠を描画し、そのデバイスコンテキストの状態を保存しておきます。次に緑の点線枠、青の二点鎖線枠を描画します。その後RestoreDCで保存された状態を復元(赤実線で枠)し、描画しています。

 

'================================================================
'= デバイスコンテキストの状態保存と復元
'=    (RestoreDC2.bas)
'================================================================
#include "Windows.bi"

' 指定のデバイスコンテキストの現在の状態を保存
Declare Function Api_SaveDC& Lib "gdi32" Alias "SaveDC" (ByVal hDC&)

' SaveDC関数で保存したデバイスコンテキストを復元
Declare Function Api_RestoreDC& Lib "gdi32" Alias "RestoreDC" (ByVal hDC&, ByVal nSaveDC&)

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

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

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

' 長方形の描画
Declare Function Api_Rectangle& Lib "gdi32" Alias "Rectangle" (ByVal hDC&, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)

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

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

#define PS_DASH 1                       '破線のペンを作成(ペンの幅がデバイス単位で1以下の場合のみ有効)
#define PS_DASHDOT 3                    '一点鎖線のペンを作成(ペンの幅がデバイス単位で1以下の場合のみ有効)
#define PS_DASHDOTDOT 4                 '二点鎖線のペンを作成(ペンの幅がデバイス単位で1以下の場合のみ有効)
#define PS_DOT 2                        '点線のペンを作成(ペンの幅がデバイス単位で1以下の場合のみ有効)
#define PS_INSIDEFRAME 6                '塗りつぶし
#define PS_NULL 5                       '空のペンを作成。描画は行われない
#define PS_SOLID 0                      '実線のペンを作成

Var Shared Text1 As Object
Var Shared Button1 As Object

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

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hDC As Long
    Var mSaveDC As Long
    Var mPen As Long
    Var Ret As Long 

    'デバイスコンテキスト取得
    hDC = Api_GetDC(GethWnd)

    Cls
    '------------------------------
    mPen = Api_CreatePen(PS_SOLID, 10, RGB(255, 0, 0))    '論理ペンの作成
    Ret = Api_SelectObject(hDC, mPen)                     'オブジェクトを選択
    Ret = Api_Rectangle(hDC, 20, 15, 60, 60)              '長方形を描画
    mSaveDC = Api_SaveDC(hDC)                             '現在の状態を保存

    Text1.SetWindowText "太く赤い実線で枠を描画" & Chr$(13, 10) & "現在のDCを保存"
    Wait 300

    '------------------------------
    mPen = Api_CreatePen(PS_DOT, 0, RGB(0, 255, 0))       '論理ペンの作成
    Ret = Api_SelectObject(hDC, mPen)                     'オブジェクトを選択
    Ret = Api_Rectangle(hDC, 70, 15, 110, 60)             '長方形を描画

    Text1.SetWindowText "細い緑の点線で枠を描画"
    Wait 300

    '------------------------------
    mPen = Api_CreatePen(PS_DASHDOTDOT, 0, RGB(0, 0, 255))'論理ペンの作成
    Ret = Api_SelectObject(hDC, mPen)                     'オブジェクトを選択
    Ret = Api_Rectangle(hDC, 120, 15, 160, 60)            '長方形を描画

    Text1.SetWindowText "細い青の二点鎖線で枠を描画"
    Wait 300
    '------------------------------
    Ret = Api_RestoreDC(hDC, mSaveDC)                     '保存したデバイスコンテキストを復元
    Ret = Api_Rectangle(hDC, 170, 15, 210, 60)            '長方形を描画

    Text1.SetWindowText "SaveDCで保存したDCを復元して描画"

    '解放・削除
    Ret = Api_ReleaseDC(GetWnd, hDC)
    Ret = Api_DeleteObject(mPen)
End Sub

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