Plutonixの説明と同様に、リフレッシュはInvalidate
メソッドを呼び出すことで処理されます。
覚えておく必要があることは、サーフェス上にペイントされているものは永続的ではないため、毎回画面全体を再描画する必要があるということです。このプロセスは非常にCPUを集中させる可能性があるため、パフォーマンス目的でこれを最適化する方法は多数あります。特に、GDI +はハードウェアアクセラレーションではないためです。
だから、何をする必要がある:
録音すべてのクリック(X、Y位置)とは、各円の半径はランダムであるので、それを
を保存するときの半径を決定しますユーザーはフォームをクリックし、それをクリックのx、y位置とともに保存します
次に、Paint
イベントをクリックして保存された一連のクリック(それぞれの半径で)を描画し、各円を再描画します何度も。
ここでは、このトリックを行う実装について説明します。ただ、それをテストするために、任意のフォームのクラス内でこのコードを貼り付けます。
Private Class Circle
Public ReadOnly Property Center As Point
Public ReadOnly Property Radius As Integer
Public Sub New(center As Point, radius As Integer)
Me.Center = center
Me.Radius = radius
End Sub
End Class
Private circles As New List(Of Circle)
Private radiusRandomizer As New Random()
Private Sub FormLoad(sender As Object, e As EventArgs) Handles MyBase.Load
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True) ' Not really necessary in this app...
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.UserPaint, True)
End Sub
Private Sub FormMouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
circles.Add(New Circle(New Point(e.X, e.Y), radiusRandomizer.Next(10, 100)))
Me.Invalidate()
End Sub
Private Sub FormPaint(sender As Object, e As PaintEventArgs) Handles Me.Paint
Dim g As Graphics = e.Graphics
g.Clear(Color.Black)
Using p As New Pen(Color.White)
For Each c In circles
g.DrawEllipse(p, c.Center.X - c.Radius \ 2, c.Center.Y - c.Radius \ 2, c.Radius, c.Radius)
Next
End Using
End Sub
は、ここでは、ペイントイベントはすべてそれ自体でかなり頻繁に実行される形
出典
2016-03-30 07:53:02
xfx
に数回のクリック後に買ってあげるものです。 'me.invalidate'または' me.refresh'を強制します。 – Plutonix
毎回同じことをペイントして持続するので、強制的に再描画するのは無意味です。 – Plutonix
私はペイントイベントなしで何をしようとしているのですか? –