投稿者 反る戸  (社会人) 投稿日時 2010/2/7 00:32:57
はじめまして

 VB2005のProfessional Edition を使用しています。VB2005でStretchBltを
使用したいと思い、ネットで検索した所下記のページを見つけました。
http://standardization.at.webry.info/200810/article_2.html

 このページのソースを参考に以下のようなプログラムを作成してみました。
フォームにピクチャーボックス2つとボタン1つを貼っています。

 このコードでは、ピクチャーボックスからデバイスコンテキストを取得して
いますが、それですとスクリーンのデバイスコンテキストになっているようで、
PictutureBox1の上にPictureBox2が重なる部分ではPictureBox2の背景が転送さ
れ、更にはフォームをはみ出てデスクトップや別のアプリのウィンドウの一部
が画像として転送されてしまいます。

Public Class Form1
    Private Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" _
        (ByVal hdc As IntegerByVal x As IntegerByVal y As Integer, _
        ByVal nWidth As IntegerByVal nHeight As Integer, _
        ByVal hSrcDC As Integer, _
        ByVal xSrc As IntegerByVal ySrc As Integer, _
        ByVal nSrcWidth As IntegerByVal nSrcHeight As Integer, _
        ByVal dwRop As IntegerAs Integer
    Private Const SRCCOPY = &HCC0020 ' (DWORD) dest = source 

    Private x As Integer
    Private y As Integer

    Private Sub Form1_Load(ByVal sender As Object, _
                ByVal e As System.EventArgs) Handles Me.Load
        Dim gr1 As Graphics
        Dim gr2 As Graphics
        Me.PictureBox1.Image = New Bitmap(480, 256)
        Me.PictureBox1.Width = Me.PictureBox1.Image.Width
        Me.PictureBox1.Height = Me.PictureBox1.Image.Height
        gr1 = Graphics.FromImage(Me.PictureBox1.Image)
        gr1.DrawImage(Image.FromFile("..\..\..\chipset13.png"), 0, 0)
        gr1.Dispose()
        Me.PictureBox2.Image = New Bitmap(32, 32)
        x = 0
        y = 0
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles Button1.Click
        Dim g1 As Graphics = PictureBox1.CreateGraphics()
        Dim g2 As Graphics = PictureBox2.CreateGraphics()
        Dim srcdc As IntPtr = g1.GetHdc()
        Dim destdc As IntPtr = g2.GetHdc()
        Dim retval As Integer
        retval = StretchBlt(destdc, 0, 0, 32, 32, _
                            srcdc, x, y, 16, 16, SRCCOPY)
        g2.ReleaseHdc(destdc)
        g1.ReleaseHdc(srcdc)
        g2.Dispose()
        g1.Dispose()

        x += 16
        If x > 320 Then
            x = 0
            y += 16
        End If
    End Sub
End Class


 試しに、ピクチャーボックスのImageからGraphicsを作成してみました
が、それだと真っ黒な四角が描画されます。
 メモリデバイスコンテキストを作らなければ駄目なのかと思い、srcdcの
生成を以下のようにしてみました。
        Dim srcdc As IntPtr = CreateCompatibleDC(destdc)
        Dim hbmSrc As IntPtr = DirectCast(Me.PictureBox1.Image, _
                               Bitmap).GetHbitmap()
        SelectObject(srcdc, hbmSrc)

 ソース側はこれでうまくいき、PictureBox1のImageの内容を転送できる
ようになりました。
 しかし、デスティネーション側はピクチャーボックスのGraphicsを使用
しないとうまくいきません。Imageをデスティネーションにする方法はない
のでしょうか?