投稿者 反る戸  (社会人) 投稿日時 2010/2/10 07:31:33
自己解決しました。以下のURLに答えがありました。
http://dobon.net/vb/bbs/log3-39/24003.html#ID24003

 こういうことだったようです。
1.GraphicsはImageから取得してよいが、転送元のデバイスコンテキストは
 BitmapからGetHbitmap()で作成したbmpのハンドルをSelectObjectで選択して
 やらなければならない。
2.転送先のデバイスコンテキストでSelectObjectを使ってはいけない。

 質問時のコードのButton1_Clickを以下のように修正するとうまくいきました。
SelectObject()とDeleteObject()の宣言は別に追加していますが。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim g1 As Graphics = Graphics.FromImage(PictureBox1.Image)
        Dim g2 As Graphics = Graphics.FromImage(PictureBox2.Image)

        g2.DrawRectangle(Pens.BlueViolet, 2, 2, 26, 26)

        Dim srcDc As IntPtr = g1.GetHdc()
        Dim destDc As IntPtr = g2.GetHdc()
        Dim srcHbmp As IntPtr = DirectCast(Me.PictureBox1.Image, Bitmap).GetHbitmap()
        SelectObject(srcDc, srcHbmp)

        Dim retval As Integer
        retval = StretchBlt(destdc, 0, 0, 32, 32, srcdc, x, y, 16, 16, SRCCOPY)

        DeleteObject(srcHbmp)
        g2.ReleaseHdc(destdc)
        g1.ReleaseHdc(srcdc)
        g2.Dispose()
        g1.Dispose()
        Refresh()
        x += 16
        If x > 320 Then
            x = 0
            y += 16
        End If
    End Sub

 お騒がせしました。今後ともよろしくお願いします。