2016-03-29 42 views
0

Tamam, tıklattığınız her yerde (her nerede tıkladığınız) rastgele renkli ve boyutlandırılmış bir daire göründüğü bir program yapmaya çalışıyorum. ancak bir şekil ekleyebileceğim tek yol Paint olayıdır. Ben fare tıklaması durumunda kullanabileceğiniz bir kod satırını bilmemiz gerekirPaint olayı bir formda birden çok kez nasıl kullanılır?

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 

, bu denizaltıyı yeniden çalıştırmak olacaktır: Burada Şimdi sahip koddur. Boyutları nasıl değiştireceğimi biliyorum ve rastgele yapalım, bu alt-katmanı nasıl daha çok çalıştırılacağını bilmiyorum, daha doğrusu; Her fare tıklattıktan sonra bu alt bir kez çalıştırın. Birisi yardım ederse, minnettar olurum!

+3

üzerinde birkaç tıklama sonra alırsınız budur. zorlamak için, 'me.invalidate' veya 'me.refresh' – Plutonix

+0

Her seferinde aynı şeyi boyadığı ve devam edeceği için, yeniden boyamaya zorlamak anlamsız görünüyor. – Plutonix

+0

Boya olayı olmadan denediğimi yapabileceğim herhangi bir yol var mı? –

cevap

0

Plutonix'in açıkladığı gibi, bir yenileme işlemi Invalidate yöntemini çağırarak işlenir.

Hatırlamak zorunda olmanız gereken şey, bir yüzeye boyanmış olmanın kalıcı olmamasıdır, bu nedenle her seferinde tüm ekranı yeniden çizmeniz gerekir. Elbette, bu işlemin performans açısından optimize edilebileceği pek çok yol vardır; çünkü bu işlem son derece yoğun CPU yoğun olabilir; Özellikle, GDI + donanımı hızlandırılmadığından.

Peki, ne yapmak gerekir ise:

  1. Tutanak her tıklama (x, y konum) ve her çemberin yarıçapı rasgele olduğundan, o

  2. depolamak zaman yarıçapı belirlemek kullanıcı formu tıkladığında, o zaman, x, bir tıklama sonra

  3. y konumu ile birlikte saklayın sahip Paint olay yeniden çizmek (kendi yarıçapı olan) tıklama saklanan her dizi ve her bir daire yeniden çizmek tekrar ve tekrar .

İşte hile yapacak bir uygulama. Sadece denemeniz için herhangi form'ın sınıf içinde bu kodu yapıştırın:

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 

Burada boya olay tüm kendisi tarafından oldukça sık ishal forma enter image description here

+0

Takdir! –