DOBON.NET DOBON.NETプログラミング掲示板過去ログ

PictutureBoxの画像について

環境/言語:[WindowsXP,VB.NET]
分類:[.NET]

VB.NETのPictureBoxで描画された画像の上に他の画面等がくると消えてしまいます。
過去ログの「http://dobon.net/vb/bbs/log3-3/1380.html#1385」や「http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html」を見たのですが、私の場合、VB6.0の時に使用していたDLLの内でPictureBoxに描画をしているため、上記のURLのような方法が使えません。

DLLはVC++6.0で作成されており、PictureBoxに描画する関数には、PictureBoxのハンドルと描画サイズを引数で渡しています。

プログラムは簡単に描くと以下の通りです。

'DLLの描画関数
Private Declare Sub DrawBitMap Lib "MapDraw" (ByVal hdc As Integer, ByVal intWidth As Integer, ByVal intHeght As Integer)
'PictutureBoxのハンドル取得API関数
Private Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hWnd As Integer) As Integer


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim hdc As Integer

hdc = GetDC(PictureBox1.Handle.ToInt32) 'PictureBox1のハンドルを取得

Call DrawBitMap (hdc, PictureBox1.Width, PictureBox1.Heght)  'DLLでPictureBoxに描画

End Sub


といった感じです。
DLLの方は変更したくないので何かよい方法がありましたらアドバイスよろしくお願い致します。
> VB.NETのPictureBoxで描画された画像の上に他の画面等がくると消えてしまいます。
PictureBoxの上に他画面を表示し、その後PictureBoxを前面に表示すると
画像が消えている、ということでしょうか?

もしそうであれば、PictureBoxのPaintイベント時に描画を行う必要があります。
次のような処理でどうでしょうか?
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
 Dim hdc As IntPtr = e.Graphics.GetHdc()
 Call DrawBitMap (hdc.ToInt32, PictureBox1.Width, PictureBox1.Heght)  'DLLでPictureBoxに描画
 e.Graphics.ReleaseHdc(hdc) '必ずReleaseする
End Sub
NowhereManさんありがとうございます。
NowhereManさんのやり方で出来ました。

しかし、「3923」ではDLL関数を一つしか呼んでいませんが、実際は複数の関数を呼んでいます。
そのため、「3925」では、Paintイベント受信時にPictureBox全体を描画しなくてはならないため、処理時間が結構かかってしまいます。

処理時間を考慮し、以下のようなプログラムを考えてみたのですが・・・


Dim MyBitmap As Bitmap  'Button1_Clickイベント時に保持(Form1_Closingで破棄する)


Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

Try
If Not IsNothing(MyBitmap) Then
'画像を表示
e.Graphics.DrawImage(MyBitmap, 0, 0)
End If
Catch ex As Exception
End Try

End Sub


と、これなら一度の描画ですむため、再描画の処理時間がかからないと思っていたのですが・・・。

やはり、「3923」のURLにあるようにPictureBoxのImageを取得することは不可能なのでしょうか?

引続き、よい方法ありましたらアドバイスよろしくお願い致します。
なるほど、そういうことですか。
http://dobon.net/vb/bbs/log3-3/1380.html#1385
を改造して、次のやり方ではどうでしょう?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 ' PictureBoxのImageプロパティにBitmapオブジェクトを設定。
 Dim bmp As Bitmap = New Bitmap(PictureBox1のサイズ)
 PictureBox1.Image = bmp
 ' Bitmapオブジェクトに描画。
 Dim g As Graphics = Graphics.FromImage(bmp)
 Dim hdc As IntPtr = g.GetHdc()
 Call DrawBitMap (hdc.ToInt32, PictureBox1.Width, PictureBox1.Heght)
 ...
 g.ReleaseHdc(hdc) '必ずReleaseする
End Sub
No3933で書き忘れました。
この対処をすると、Paintイベントでの処理は不要です。
NowhereManさんありがとうございます。
言われたとおりにやったら出来ました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板