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

PictureBoxのPaintイベントが呼ばれない

環境/言語:[OS : Windows XP Professional / 言語 : Visual Basic .NET / .NET Framework : 2.0]
分類:[.NET]

【解決したい問題】

複数レイヤの画像データを含んでいるデータを分解し、各レイヤの画像を表示させようとしています。
 データの分解と、各レイヤへの分離及び表示には成功しました。

 これを、複数のデータで行おうとした際に問題が起こりました。
 
 複数レイヤの表示は、Pictureboxを含むフォームを配列で保持し、同時に表示させました。

' PForm() はフォームの配列です
For _R As Integer = 0 To iR - 1
PForm(_R) = New Picture(iX, iY)
PForm(_R).Show()
Next

 表示後、下記の方法でレイヤ毎に分解した画像データを渡します

'BMPBuffは各レイヤの画像データ
PForm(_R).SetBMP(BMPBuff)

 ここで、PFormは下記の通りです

Public Class Picture
Dim BMP As Bitmap
Public Sub New(ByVal X As Integer, ByVal Y As Integer)

' この呼び出しは、Windows フォーム デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後で初期化を追加します。
With Me
.Width = X / 2
.Height = Y / 2
.MaximizeBox = False
.MinimizeBox = False
End With
BMP = New Bitmap(X, Y, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
' PBox =>PictureBox
With Pbox
.Width = BMP.Width / 2
.Height = BMP.Height / 2
.Location = New Point(0, 0)
.Image = BMP
End With
End Sub
Public Sub SetBMP(ByRef BMPBuff() As Byte)
Dim BD As Imaging.BitmapData

' Lock
BD = BMP.LockBits(New Rectangle(0, 0, BMP.Width, BMP.Height), Imaging.ImageLockMode.WriteOnly, BMP.PixelFormat)
Dim bp As System.IntPtr
bp = BD.Scan0 ' ポインタの取得
Copy(BMPBuff, 0, bp, BMPBuff.Length - 1)
BMP.UnlockBits(BD)
End Sub
Private Sub Pbox_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Pbox.Paint
    Debug.WriteLine("Call")
If Not (BMP Is Nothing) Then
e.Graphics.DrawImage(BMP, 0, 0, CInt(BMP.Width / 2), CInt(BMP.Height / 2))
End If
End Sub

 1つのデータを読み込み、分解し、表示させることはできたのですが、これを連続して行うと、PictureBoxの表示が更新されません。

 データ取得→分解→画像表示を連続で行うためにはどうすればよいのでしょうか?

【解決するために何をしたか】

ひとまず、Pbox_Paintが呼ばれているかDebugメッセージを確認しながら、PFormに画像データを渡したあとに、PFormにフォーカスをあてたり、Activateしたりしました。
 結果、最後のデータを処理した後に呼ばれていますが、それまでは1度も呼ばれていませんでした。
自己レスです。
 以下を追加したところ表示されるようになりました。ありがとうございました

Public Sub SetBMP(ByRef BMPBuff() As Byte)
Dim BD As Imaging.BitmapData

' Lock
BD = BMP.LockBits(New Rectangle(0, 0, BMP.Width, BMP.Height), Imaging.ImageLockMode.WriteOnly, BMP.PixelFormat)
Dim bp As System.IntPtr
bp = BD.Scan0 ' ポインタの取得
Copy(BMPBuff, 0, bp, BMPBuff.Length - 1)
BMP.UnlockBits(BD)
' 以下追加
Dim G as Graphics=PBOX.CreateGraphics
G.DrawImage(BMP, 0, 0, CInt(BMP.Width / 2), CInt(BMP.Height / 2))
Pbox.Invalidate
' ここまで
End Sub
解決済み!

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