【API Function】


メモリDCの使用例
 AutoRedraw=FalseをメモリDCを使ってAutoRedraw=Trueのように見せる プログラムだけでは、何の役に立たないばかりか面倒なだけです。ここでは、 メモリDCを使用して有用なプログラム?かどうかは別にしてちょっとした使用 例を紹介しています。
 ピクチャボックスに描かれているものを加工したりしてコピーする場合、もう 1つ他のピクチャボックスを作業領域として使用するのがVisual Basic的なプロ グラムだと思いますが、ここではその作業領域にメモリDCを使用して描画されて いるものをコピーしています。
 次のようにフォームにコントロールを配置して下さい。

プロパティ表
Form1
ScaleMode3
Picture1
Appearance0
AutoRedrawTrue
BorderStyle0
ScaleMode3


Generalセクションに次の宣言コードを追加して下さい。

宣言コード
Private Declare Function CreateCompatibleDC Lib "gdi32" _
        (ByVal hdc As Long) As Long

Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc _
        As Long) As Long

Private Declare Function CreateCompatibleBitmap Lib "gdi32" _
        (ByVal hdc As Long, ByVal nWidth As Long, _
        ByVal nHeight As Long) As Long

Private Declare Function SelectObject Lib "gdi32" _
        (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" _
        (ByVal hObject As Long) As Long

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As _
        Long, ByVal x As Long, ByVal y As Long, ByVal nWidth _
        As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, _
        ByVal xSrc As Long, ByVal ySrc As Long, _
        ByVal dwRop As Long) As Long

Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As _
        Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As _
        Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal _
        xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, _
        ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long

GeneralセクションにCopyPicプロシージャを作成し、 プログラムコードを追加します。(描画部分のコードは、特に 何でもいいんですけど)

'===========================================================
'プロシージャ名  CopyPic
'処理 − メモリDCを使ってピクチャボックスの画像に処理をする
'-----------------------------------------------------------
'引数リスト
'SourcePicPic  処理させたい画像があるピクチャボックス
'CopyType      処理方法
'-----------------------------------------------------------
'===========================================================
Public Sub CopyPic(SourcePic As Object, CopyType As Integer)

    Dim mhDC As Long'メモリDC
    'SourcePicの互換性のあるビットマップのハンドル
    Dim hBitmap As Long
    '設定する前のビットマップのハンドル
    Dim hOldBitmap As Long
    Dim sx As Long, sy As Long   'コピー開始座標
    Dim spw As Long, sph As Long 'コピー元の画像の幅,高さ
    Dim tpw As Long, tph As Long 'コピー元の画像の幅,高さ

    'コピー元の画像の幅,高さを得る
    spw = SourcePic.ScaleWidth
    sph = SourcePic.ScaleHeight

    'メモリDCを作成
    mhDC = CreateCompatibleDC(SourcePic.hdc)
    'SourcePicの互換性のあるビットマップを作成する
    hBitmap = CreateCompatibleBitmap(SourcePic.hdc, spw, sph)
    'それをメモリDCに設定する
    hOldBitmap = SelectObject(mhDC, hBitmap)
    'メモリDCにコピー元の画像をコピーする
    BitBlt mhDC, 0&, 0&, spw, sph, SourcePic.hdc, 0&, 0&, vbSrcCopy
    'CopyTypeで処理の種類を区別する
    Select Case CopyType
        Case 0 '鏡像(Y軸対称)
            sx = spw - 1&
            sy = 0&
            tpw = -spw
            tph = sph
        Case 1 '鏡像(X軸対称)
            sx = 0&
            sy = spw - 1&
            tpw = spw
            tph = -sph
        Case 2 '180度回転
            sx = spw - 1&
            sy = sph - 1&
            tpw = -spw
            tph = -sph
    End Select

    '背景を指定位置からアイコンサイズにコピーする
    StretchBlt SourcePic.hdc, sx, sy, tpw, tph, mhDC, 0&, 0&, _
                              spw, sph, vbSrcCopy

    'まず、メモリDCから削除する
    DeleteDC mhDC
    'ビットマップも削除
    'この順番が違うと破棄できない
    DeleteObject hBitmap
    'コピーを反映させる
    SourcePic.Refresh
End Sub

最後に、Command1_Clickプロシージャに以下のコードを追加します。

Private Sub Command1_Click(index As Integer)
    Call CopyPic(Picture1, index)
End Sub

フォーム上に配置するコントロールを少しでも少なくすることはプログラムの シンプル化になりますし、プログラム起動時の高速化にもつながります。より 複雑で重い処理を行う必要があるときは、このようにメモリDCを使用すること が適切かもしれません。


API Functionインデックス トップ


Copyright(C)1999 Tomoya. All rights reserved.