2016-03-29 3 views
0

Хорошо, поэтому я пытаюсь сделать программу, которая каждый раз, когда вы нажимаете (не имеет значения, где), появляется случайный цветной и размерный круг, где вы случайно нажимали. однако единственный способ добавить фигуру - через событие Paint. вот код я сейчас:Как использовать событие 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 

мне нужно знать строку кода, который я могу использовать в случае щелчка мыши, который будет повторно запустить этот сабвуфер. Я знаю, как изменить размер и сделать его случайным, я просто не знаю, как запустить этот sub несколько раз, точнее; запустите этот суб один раз после каждого щелчка мышью. Если кто-то может помочь, я был бы признателен!

+3

Событие краски проходит довольно часто все сами по себе. заставить его, 'me.invalidate' или' me.refresh' – Plutonix

+0

Поскольку он каждый раз рисует одно и то же, и будет сохраняться, кажется бессмысленным заставить его перерисовать. – Plutonix

+0

Есть ли способ, которым я могу делать то, что я пытаюсь без события рисования? –

ответ

0

Как объяснил Плутоникс, обновление обрабатывается путем вызова метода Invalidate.

Необходимо помнить, что все, что нарисовано на поверхности, не является постоянным, поэтому вам нужно каждый раз перерисовывать весь экран. Разумеется, есть много способов, с помощью которых это можно оптимизировать для повышения производительности, так как этот процесс может быть чрезвычайно интенсивным для процессора; особенно, поскольку GDI + не аппаратно ускоряется.

Итак, что вам нужно сделать, это:

  1. Запись каждый щелчок (х, у позиции) и хранить его

  2. Поскольку радиус каждой окружности случайным образом, определить радиус когда пользователь нажимает на форму, а затем сохраняет ее вместе с положением x, y на кнопке

  3. Затем необходимо провести повторное рисование каждой сохраненной последовательности щелчков (с соответствующими радиусами) вновь и вновь ,

Вот реализация, которая сделает трюк. Просто вставьте этот код внутри класса какой-либо формы, чтобы проверить:

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

Очень ценный! –