[英]How to draw circle and move in c#
我試圖繪制一個圓圈並在c#中以一種形式移動它。 我使用GDI繪制,如下所示。 假設我有1個圓圈
int postitionX, postitionY, radius, angle;
void Draw(Graphics g)
{
g.DrawEllipse(Pen, postitionX, postitionY, radius, radius);
g.FillEllipse(SolidBrush, postitionX, postitionY, radius, radius);
}
並且在表格main I init circle(postitionX = 0,postitionY = 10,radius = 20,angle = 30;)
private void form_Paint(object sender, PaintEventArgs e)
{
<caculation postition next>
mycircle.Draw(e.Graphics)
}
但問題是函數form_Paint運行多次並使圓圈移出顯示。 有人能給我解決方案嗎?
Invalidate
將導致表單的完全重繪,並將調用您的`form_Paint'事件處理程序。 這將導致無限循環。 (我現在看到TaW就在前面)。 如果要在表單上為圓圈設置動畫,可以使用以下方法:
在表單上放置一個Timer
,將Interval
設置為30, Enabled
為True。 實現Tick
事件:
private int deltaX = 1;
private int deltaY = 1;
private void timer1_Tick(object sender, EventArgs e)
{
// TO DO your caculation postition, like so:
// be sure window width/height is much larger than 2 * radius:
if ((postitionX - radius) <= 0)
deltaX = 1;
if ((postitionX + radius) >= ClientRectangle.Width)
deltaX = -1;
positionX += deltaX;
if ((postitionY - radius) <= 0)
deltaY = 1;
if ((postitionY + radius) >= ClientRectangle.Heigth)
deltaY = -1;
positionY += deltaY;
// Now you have calculated a 'new animation frame'.
// Now force repaint to draw.
Invalidate(); // This will force a repaint
}
現在更新你的form_Paint處理程序:
private void form_Paint(object sender, PaintEventArgs e)
{
// caculation postition next HAS TO BE REMOVED FROM HERE
mycircle.Draw(e.Graphics)
// Invalidate(); HAS TO BE REMOVED FROM HERE
}
通過使用timer1.Interval的timer1.Interval
結合下一個位置的計算,可以使動畫更慢或更快。
所以假設我繪制圓圈的路徑轉到3點。 如果我使用計時器滴答,那么如何。
private void timer1_Tick(object sender, EventArgs e)
{
// Go to point 1
// Go to point 2
// Go to point 3
}
private void form_Paint(object sender, PaintEventArgs e)
{
// caculation postition next HAS TO BE REMOVED FROM HERE
mycircle.Draw(e.Graphics)
// Invalidate(); HAS TO BE REMOVED FROM HERE
}
所以圓圈將經過第3點然后form_main開始重繪。我不想要那樣。 那么,你怎么可能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.