원 X
과 Y
비아 의 지름과 중심점을 입력하면 원을 그리는 응용 프로그램을 만들고 있습니다. TextBox
PictureBox를 내부.
응용 프로그램을 실행하고 일정한 X와 Y를 입력했지만 원의 지름을 천천히 늘리거나 줄이면 X와 Y 위치가 일정하더라도 원이 임의의 위치에서 움직이기 시작합니다. 때로는 PictureBox
변수가 변경되지 않은 경우 (X Pos, Y Pos 및 Diameter)를 새로 고치면 아무것도 변경되지 않았는데도 원이 아무 이유없이 움직입니다.
다음은 재현 할 코드입니다.
다음 변수는 이미 선언되었습니다.
Dim beginSCircleXPos As Integer 'What the user put into as the circle's center for X
Dim beginSCircleYPos As Integer 'What the user put into as the circle's center for y
Dim sCircleXPos As Integer 'Top-Left point of the circle in X
Dim sCircleYPos As Integer 'Top-Left point of the circle in Y
Dim sCircleDiameter As Integer 'The diameter that user put into.
Dim sCenterPointX As Integer 'Variables will be updated later
Dim sCenterPointY As String
PictureBox
의 Paint
이벤트
beginSCircleXPos = TextBox1.Text
beginSCircleYPos = TextBox2.Text
sCircleXPos = beginSCircleXPos - sCircleDiameter / 2
sCircleYPos = beginSCircleYPos - sCircleDiameter / 2
sCircleDiameter = TextBox3.Text
Using path As New GraphicsPath
path.AddEllipse(sCircleXPos, sCircleYPos, sCircleDiameter, sCircleDiameter)
sCenterPointX = sCircleXPos + sCircleDiameter / 2
sCenterPointY = sCircleYPos + sCircleDiameter / 2
Using brush As New PathGradientBrush(path)
brush.CenterPoint = New PointF(sCenterPointX, sCenterPointY)
brush.CenterColor = Color.FromArgb(0, Color.Orange)
brush.SurroundColors = {Color.Orange}
brush.FocusScales = PointF.Empty
e.Graphics.FillRectangle(brush, sCircleXPos, sCircleYPos, sCircleDiameter, sCircleDiameter)
End Using
End Using
명령이 PictureBox
있는 버튼을 클릭하면이 새로 고쳐진 다는 점은 주목할 가치가 PictureBox1.Refresh()
있습니다.
중심점 입력과 X / Y 값이 매번 정확하고 일정한 답을 얻을 수 있도록이 문제를 어떻게 해결할 수 있습니까?
편집하다:
beginSCircleXPos = Convert.ToSingle(TextBox1.Text)
beginSCircleYPos = Convert.ToSingle(TextBox2.Text)
sCircleXPos = beginSCircleXPos - sCircleDiameter / 2
sCircleYPos = beginSCircleYPos - sCircleDiameter / 2
sCircleDiameter = Convert.ToSingle(TextBox3.Text)
Using path As New GraphicsPath
path.AddEllipse(sCircleXPos, sCircleYPos, sCircleDiameter, sCircleDiameter)
sCenterPointX = sCircleXPos + sCircleDiameter / 2
sCenterPointY = sCircleYPos + sCircleDiameter / 2
Using brush As New PathGradientBrush(path)
brush.CenterPoint = New PointF(sCenterPointX, sCenterPointY)
brush.CenterColor = Color.FromArgb(0, Color.Orange)
brush.SurroundColors = {Color.Orange}
brush.FocusScales = PointF.Empty
e.Graphics.FillRectangle(brush, sCircleXPos, sCircleYPos, sCircleDiameter, sCircleDiameter)
End Using
End Using
```
Variables:
Dim beginSCircleXPos As Single Dim beginSCircleYPos As Single
Dim sCircleXPos As Single
Dim sCircleYPos As Single
Dim sCircleDiameter As Single
Dim sCenterPointX As Single
Dim sCenterPointY As Single
나는 당신의 코드를 너무 자세히 보지 않았습니다. 나는 이전 질문에 답하기 위해 제공 한 코드를 여전히 가지고 있으므로 그것을 기초로 사용하고 내가 직접 할 것처럼 수정했습니다. 나는 그것을 조금 더 간단하게 만들기 위해 매초마다 한 번씩 Timer
다시 칠하는 데 사용했습니다 PictureBox
. 이것이 내가 끝낸 것입니다.
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
Dim centreX As Single
Dim centreY As Single
Dim diameter As Single
If Single.TryParse(TextBox1.Text, centreX) AndAlso
Single.TryParse(TextBox2.Text, centreY) AndAlso
Single.TryParse(TextBox3.Text, diameter) Then
Dim radius = diameter / 2.0F
Dim bounds As New RectangleF(centreX - radius,
centreY - radius,
diameter,
diameter)
Using path As New GraphicsPath
path.AddEllipse(bounds)
Using brush As New PathGradientBrush(path) With {.CenterPoint = New PointF(centreX, centreY),
.CenterColor = Color.FromArgb(0, Color.Orange),
.SurroundColors = {Color.Orange},
.FocusScales = PointF.Empty}
e.Graphics.FillRectangle(brush, bounds)
End Using
End Using
End If
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
PictureBox1.Invalidate()
End Sub
예상대로 작동하는 것 같았습니다. 하나 이상의에 TextBoxes
유효한 숫자가 포함되어 있지 않으면 아무것도 그려지지 않았고, 그렇지 않으면 예상되는 위치와 방법으로 등급이 매겨진 원이 그려집니다. 중심 좌표를 설정하고 직경을 변경하면 그려진 원은 일정한 중심을 유지했지만 예상대로 커지고 축소되었습니다.
원하는 경우 a Button.Click
대신 a 를 사용할 수 있습니다 Timer.Tick
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다