2016-03-29 8 views
0

さて、私はクリックするたびにランダムな色がついていて(どこにも関係なく)、あなたがクリックした場所にサイズの円が現れるプログラムを作ろうとしています。しかし、シェイプを追加できる唯一の方法はPaintイベントです。私は、マウスのクリックイベントで使用できるコードの行を知っている必要がありフォームでペイントイベントを複数回使用するにはどうすればよいですか?

Private Sub Form1_Paint(ByVal Sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint 


    Using Brush1 As New SolidBrush(Color.Orange) 
      e.Graphics.FillEllipse(Brush1, MousePosition.X, MousePosition.Y, 100, 100) 
     End Using 

End Sub 

、このサブを再実行します:ここで私が今持っているコードです。サイズを変更してランダムにする方法は分かっていますが、このサブを複数回、より正確に実行する方法はわかりません。マウスをクリックするたびにこのサブを1回実行します。誰かが助けることができれば、私はそれを感謝します!

+3

に数回のクリック後に買ってあげるものです。 'me.invalidate'または' me.refresh'を強制します。 – Plutonix

+0

毎回同じことをペイントして持続するので、強制的に再描画するのは無意味です。 – Plutonix

+0

私はペイントイベントなしで何をしようとしているのですか? –

答えて

0

Plutonixの説明と同様に、リフレッシュはInvalidateメソッドを呼び出すことで処理されます。

覚えておく必要があることは、サーフェス上にペイントされているものは永続的ではないため、毎回画面全体を再描画する必要があるということです。このプロセスは非常にCPUを集中させる可能性があるため、パフォーマンス目的でこれを最適化する方法は多数あります。特に、GDI +はハードウェアアクセラレーションではないためです。

だから、何をする必要がある:

  1. 録音すべてのクリック(X、Y位置)とは、各円の半径はランダムであるので、それを

  2. を保存するときの半径を決定しますユーザーはフォームをクリックし、それをクリックのx、y位置とともに保存します

  3. 次に、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 

は、ここでは、ペイントイベントはすべてそれ自体でかなり頻繁に実行される形 enter image description here

+0

非常に感謝しています! –

関連する問題