I am developing a target software and I need to keep track of shots on the picturebox using drawstring and a number by the circle. My issue is that every circle I draw, all the numbers on the previous circle update to the same (i.e. 4 circles all have "4", draw another and they all update to "5", etc.).
I have attached an image and my code:
Here's the code:
Public Class TargetAnalysis
Dim n As Integer = 0
Dim zoomPct As Decimal = 1
Dim shotList As New List(Of Point)
Dim scaleList As New List(Of Point)
Dim poaList As New List(Of Point)
Dim ShotCount As New List(Of Point)
Private Sub mPictureBox_MouseClick(sender As Object, e As MouseEventArgs) Handles mPictureBox.MouseClick
If e.Button = MouseButtons.Left Then
If shotFlag = True Then
n += 1
_shotX = e.X
_shotY = e.Y
shotList.Add(New Point(_shotX, _shotY))
ShotCount.Add(New Point(_shotX, _shotY))
shotDist = Math.Sqrt((_shotX - _poaX) ^ 2 + (_shotY - _poaY) ^ 2)
Me.lbDataPoints.Items.Insert(shotList.Count - 1, "SHOT - " &
FormatNumber(shotDist * pLineDist(), 2) & " in.")
Me.txtShotCount.EditValue = shotList.Count
mPictureBox.Refresh()
End If
end if
End Sub
Private Sub mPictureBox_Paint(sender As Object, e As PaintEventArgs) Handles mPictureBox.Paint
'SHOT number
For Each s As Point In ShotCount
Dim calRad As Decimal = cboCaliber.EditValue / pLineDist() / 2
Dim _shot As New ShotCount(e.Graphics, New Point(s.X + calRad, s.Y + calRad), cboCaliber.EditValue / pLineDist() / 2,
"Consolas", FormatNumber((Math.Sqrt((s.X - _poaX) ^ 2 + (s.Y - _poaY) ^ 2)) *
pLineDist(), 2) & "in")
Next
end sub
This code does not increment, but does show and persist the distances
Public Class TargetAnalysis
Dim shotList As New List(Of Point)
Dim shotFlag As Boolean
Private Function ShotDistance(ByVal shot As Point) As Double
' _poaX and _poaY are the origin?
Return Math.Sqrt((shot.X - _poaX) ^ 2 + (shot.Y - _poaY) ^ 2) * pLineDist()
End Function
Private Sub mPictureBox_MouseClick(sender As Object, e As MouseEventArgs) Handles mPictureBox.MouseClick
If e.Button = MouseButtons.Left AndAlso shotFlag Then
Dim shot As New Point(e.X, e.Y)
shotList.Add(shot)
shotDist = ShotDistance(shot)
Me.lbDataPoints.Items.Insert(shotList.Count - 1, String.Format("SHOT - {0:N2} in.", shotDist))
Me.txtShotCount.EditValue = shotList.Count
mPictureBox.Refresh()
End If
End Sub
Private Sub mPictureBox_Paint(sender As Object, e As PaintEventArgs) Handles mPictureBox.Paint
Dim calRad As Decimal = cboCaliber.EditValue / pLineDist() / 2
For i As Integer = 0 To shotList.Count - 1
Dim shot As Point = shotList(i)
Dim dist As Double = ShotDistance(shot)
Dim labelLoc As New Point(shot.X + calRad, shot.Y + calRad)
Dim text As String = String.Format("Shot {0} - {1:N2} in.", i + 1, dist)
DrawShotLabel(e.Graphics, text, labelLoc)
Next i
End Sub
Private Sub DrawShotLabel(g As Graphics, label As String, location As Point)
Dim consolas As New Font("Consolas", 8)
Dim textSize As Size = g.MeasureString(label, consolas).ToSize()
g.FillRectangle(Brushes.White, New Rectangle(location, textSize))
g.DrawString(label, consolas, Brushes.Black, location)
End Sub
End Class