VB.NET フォームの個々のピクセルの色を変更するにはどうすればよいですか?
ありがとう。
Winforms の厳しい要件は、Windows が要求するたびにフォームを再描画できる必要があるということです。これは、ウィンドウを最小化して元に戻すと発生します。または、古いバージョンの Windows で別のウィンドウを自分のウィンドウに移動すると、.
したがって、ウィンドウにピクセルを設定するだけでは十分ではありません。ウィンドウが再描画されると、ピクセルがすべて失われます。代わりにビットマップを使用してください。追加の負担は、ユーザー インターフェイスの応答性を維持する必要があるため、ワーカー スレッドで計算を行う必要があることです。BackgroundWorker は、それを正しく行うのに便利です。
これを行う 1 つの方法は、2 つのビットマップを使用することです。1 つはワーカーに入力し、もう 1 つは表示します。たとえば、ピクセルの 1 行ごとに作業中のビットマップのコピーが作成され、それが ReportProgress() に渡されます。その後、ProgressChanged イベントは古いビットマップを破棄し、渡された新しいビットマップを格納し、Invalidate を呼び出して再描画を強制します。
これらのリソースが役に立つかもしれません:フォームの背景色を設定する
ここにいくつかのデモコードがあります。ハンスが述べた理由により、再描画が遅い. それを高速化する簡単な方法は、遅延後にビットマップのみを再計算することです。
Public Class Form1
Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
'create new bitmap
If Me.ClientRectangle.Width <= 0 Then Exit Sub
If Me.ClientRectangle.Height <= 0 Then Exit Sub
Using bmpNew As New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
'draw some coloured pixels
Using g As Graphics = Graphics.FromImage(bmpNew)
For x As Integer = 0 To bmpNew.Width - 1
For y As Integer = 0 To bmpNew.Height - 1
Dim intR As Integer = CInt(255 * (x / (bmpNew.Width - 1)))
Dim intG As Integer = CInt(255 * (y / (bmpNew.Height - 1)))
Dim intB As Integer = CInt(255 * ((x + y) / (bmpNew.Width + bmpNew.Height - 2)))
Using penNew As New Pen(Color.FromArgb(255, intR, intG, intB))
'NOTE: when the form resizes, only the new section is painted, according to e.ClipRectangle.
g.DrawRectangle(penNew, New Rectangle(New Point(x, y), New Size(1, 1)))
End Using
Next y
Next x
End Using
e.Graphics.DrawImage(bmpNew, New Point(0, 0))
End Using
End Sub
Private Sub Form1_ResizeEnd(sender As Object, e As System.EventArgs) Handles Me.ResizeEnd
Me.Invalidate() 'NOTE: when form resizes, only the new section is painted, according to e.ClipRectangle in Form1_Paint(). We invalidate the whole form here to form an entire form repaint, since we are calculating the colour of the pixel from the size of the form. Try commenting out this line to see the difference.
End Sub
End Class