Что, казалось бы, простое усилие в этом случае на самом деле оказывается проще с несколькими битами фоновых знаний.
Form1.Paint
событие возникает, когда форма считается нужен повторно краску, например, если она была покрыта другой форме. Для этого упражнения вы можете не беспокоиться о появлении большего количества точек, чем кажется на первый взгляд. Я не буду рассматривать этот вопрос здесь.
Объект e.Graphics
не то, что вы хотите, если хотите сохранить графику, вместо этого вы хотите использовать объект, полученный от Control.CreateGraphics
.
Рекомендуется использовать платформу .NET Random class вместо VB's Rnd()
.
Некоторые классы используют ресурсы, которые должны быть конкретно disposed, и поэтому у них есть метод .Dispose()
. Графические объекты имеют тенденцию быть подобными (также операции с базами данных и файлами). Вы можете использовать блок Using, чтобы позаботиться о вызове Dispose для вас.
И очень важный момент:
- Использование Option Strict On. Это поможет вам написать код, который работает, указывая на любые ошибки, которые он может обнаружить. Установите его как значение по умолчанию для новых проектов.
Еще несколько вещей, о которых я должен упомянуть, это то, что вам следует проявлять осторожность при переименовании переменных и облегчать отладку отдельных вещей в свои собственные переменные, а не писать одну длинную строку кода.
Для таких вещей, как таймеры, где вы можете перетащить таймер на поверхность чертежа, мне лучше создать его в коде. Таким образом, вам не нужно переключаться между конструктором и окнами кода для изменения параметров, и вы не задаетесь вопросом, откуда взялось что-то вроде «Timer1».
В конце концов, я придумал (не обязательно очень хорошо) код:
Option Infer On
Option Strict On
Public Class Form1
Dim rand As New Random
Dim tim As Timer
Sub DrawDots(sender As Object)
' This sub could have been called with anything as sender, so check that
' it is actually a Control
Dim self As Control = TryCast(sender, Control)
If self Is Nothing Then
Exit Sub
End If
Using g = self.CreateGraphics()
Dim nDots = rand.Next(1, 26)
Dim circleRadius = 20
For i = 1 To nDots
Dim xLoc = rand.Next(0, 420)
Dim yLoc = rand.Next(0, 420)
Dim col = Color.FromArgb(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 256))
Using br As New SolidBrush(col)
g.FillEllipse(br, xLoc, yLoc, circleRadius, circleRadius)
End Using
Next
End Using
End Sub
Sub DrawDotsOnTimerTick(sender As Object, e As EventArgs)
DrawDots(Me)
End Sub
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
DrawDots(sender)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
DrawDots(Me)
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
tim = New Timer
tim.Interval = 2000
AddHandler tim.Tick, AddressOf DrawDotsOnTimerTick
tim.Start()
End Sub
End Class
'я включил картину моего code' пожалуйста не делать - нам нужен реальный код * здесь, в * вопрос. См.: [Спросить]. Помогите нам помочь вам, не отправив нас в другом месте. – Plutonix
'call' - синтаксис VB6 (и VBA imho). Вы вызываете sub/function, просто записывая его имя с помощью скобок: 'Foo()'. Я рекомендую инкапсулировать вашу логику из обработчика краски в собственный суб и называть ее всякий раз, когда вам это нужно. –
Я попытался улучшить ваш вопрос, используя OCR на изображении вашего кода (пожалуйста, не используйте изображение текстовой информации, будь то код или сообщение об ошибке) и добавляя некоторые из вашего текста, который, к сожалению, был потерян в более раннем редактировании ,Пожалуйста, отредактируйте свой вопрос, если у меня что-то не так. –