AutoRedraw=FalseをメモリDCを使ってAutoRedraw=Trueのように見せる プログラムだけでは、何の役に立たないばかりか面倒なだけです。ここでは、 メモリDCを使用して有用なプログラム?かどうかは別にしてちょっとした使用 例を紹介しています。
ピクチャボックスに描かれているものを加工したりしてコピーする場合、もう 1つ他のピクチャボックスを作業領域として使用するのがVisual Basic的なプロ グラムだと思いますが、ここではその作業領域にメモリDCを使用して描画されて いるものをコピーしています。
次のようにフォームにコントロールを配置して下さい。プロパティ表
Form1 ScaleMode 3
Picture1 Appearance 0 AutoRedraw True BorderStyle 0 ScaleMode 3
Generalセクションに次の宣言コードを追加して下さい。GeneralセクションにCopyPicプロシージャを作成し、 プログラムコードを追加します。(描画部分のコードは、特に 何でもいいんですけど) 宣言コード
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
最後に、Command1_Clickプロシージャに以下のコードを追加します。
'=========================================================== 'プロシージャ名 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フォーム上に配置するコントロールを少しでも少なくすることはプログラムの シンプル化になりますし、プログラム起動時の高速化にもつながります。より 複雑で重い処理を行う必要があるときは、このようにメモリDCを使用すること が適切かもしれません。
Private Sub Command1_Click(index As Integer) Call CopyPic(Picture1, index) End Sub