2013-06-13 2 views
-2

У меня есть программа в winforms с меню инструментальной полосы с кнопками: +, -. каждый раз, когда я нажимаю +, он рисует растущий эллипс, и когда я рисую - он исчезает. Теперь мне удалось нарисовать растущий эллипс, но когда я нажимаю +, он рисует новый elipse. Мне нужен новый эллипс для начала внутри предыдущего эллипса, который я рисовал. поэтому, когда я нажимаю 3 раза, например, внутри будет 3 эллипса. , и когда я нажму - последний эллипс, который я нарисовал, исчезнет. У меня есть ограничение на использование draImage(). мой вопрос: как я могу создать новый эллипс внутри предыдущего, когда я снова нажму +? , когда я нажимаю кнопку +, он просто удаляет предыдущие и начинает рисовать новый эллипс. мой код выглядит следующим образом:нарисовать эллипс внутри эллипса с таймером C#

Form.cs:

public partial class TheBalls : Form 
    { 
     private Ball yourBall; 

     public TheBalls() 
     { 
      InitializeComponent(); 
      DoubleBuffered = true; 
      yourBall = new Ball(this); 
     } 

     Graphics flagGraphics; 
     List<Ball> list = new List<Ball> { }; 

     private void plusButton_MouseDown(object sender, MouseEventArgs e) 
     { 
      yourBall = new Ball(this); 
      list.Add(yourBall); 
      yourBall.Growing(); 
     } 

     private void minusButton_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (list.Count > 0) 
      { 
       list[list.Count - 1].clr = Color.Transparent; 
       list.RemoveAt(list.Count -1); 
      } 
     } 

     private void TheBalls_Paint(object sender, PaintEventArgs e) 
     { 

      Bitmap bitmap = new Bitmap(yourBall.Center.X * 2, yourBall.Center.Y * 2); 
      flagGraphics = Graphics.FromImage(bitmap); 
      yourBall.Update(flagGraphics); 
      e.Graphics.DrawImage(bitmap, 0, 0); 
     } 


    } 

шар класса: (Эллипс)

class Ball 
    { 
     private Control canvas; 
     private Timer t = new Timer(); 
     private int dir = 1; 

     public Point Center { get; set; } 
     public Color clr; 
     public int Radius { get; set; } 

     public Control Canvas 
     { 
      get { return canvas; } 
      set 
      { 
       canvas = value; 
       if (canvas != null) 
       { 
        //canvas.SizeChanged -= Canvas_SizeChanged; 
        //canvas.SizeChanged += Canvas_SizeChanged; 
        Center = new Point(canvas.ClientSize.Width/2, canvas.ClientSize.Height/ 2); 
       } 
      } 
     } 
     private static readonly Random rand = new Random(); 

     public Ball(Control canvas) 
     { 
      clr = Color.FromArgb(rand.Next(255), rand.Next(255), rand.Next(255)); 
      if (canvas != null) 
      { 
       this.canvas = canvas; 
       canvas.SizeChanged -= Canvas_SizeChanged; 
       canvas.SizeChanged += Canvas_SizeChanged; 
       Center = new Point(canvas.ClientSize.Width/2, canvas.ClientSize.Height/2); 

      } 

      t.Interval = 10; 
      t.Tick += timer_Tick; 
     } 
     private void Canvas_SizeChanged(object sender, EventArgs e) 
     { 
      Center = new Point(canvas.ClientSize.Width/2, canvas.ClientSize.Height/2); 
     } 
     public void Growing() 
     { 
      dir = 1; 
      t.Enabled = true; 

     } 

     public void timer_Tick(object sender, EventArgs e) 
     { 
      if (canvas == null) 
      { 
       //t.Stop(); 
       clr = Color.Transparent; 
       return; 
      } 
      Radius += dir; 

      if (Radius > Math.Min(canvas.ClientSize.Width, canvas.ClientSize.Height)/2) 
      { 
       Radius = Math.Min(canvas.ClientSize.Width, canvas.ClientSize.Height)/2; 
       clr = Color.Transparent; 
      } 
      canvas.Invalidate(); 
     } 

     public void Update(Graphics g) 
     { 
      g.FillEllipse(new SolidBrush(clr), new Rectangle(Center.X - Radius, Center.Y - Radius, Radius * 2, Radius * 2)); 
     } 
    } 
+2

Так что ваш вопрос? –

+0

Как я могу сделать это эллипсом внутри эллипса, когда я нажимаю +? каждый раз, когда я нажимаю «плюс», он рисует новый эллипс вместо нового внутри предыдущего. –

+2

Очень приятно. Я также время от времени занимаюсь программами ... у вас есть вопросы? –

ответ

1

Теперь его более ясным, да. Исправьте меня, если я ошибаюсь, но похоже, что вы не используете переменную list вообще, а Painting, поэтому вы каждый раз набираете только один мяч.

+0

Я использую только переменную списка, чтобы узнать, какой мяч «стирать», когда я нажимаю кнопку -. –

+0

, даже если я буду использовать список, как он может показать на форме, что первый шар все равно будет расти, а второй начнет рисовать внутри первого? вот что я не понимаю, как это сделать. –

1

Изменить событие TheBalls_Paint так:

private void TheBalls_Paint(object sender, PaintEventArgs e) 
{ 
    Bitmap bitmap = new Bitmap(yourBall.Center.X * 2, yourBall.Center.Y * 2); 
    flagGraphics = Graphics.FromImage(bitmap); 
    foreach (var ball in list) 
    { 
     ball.Update(flagGraphics); 
    } 
    e.Graphics.DrawImage(bitmap, 0, 0); 
} 
+0

это работает !!!! Спасибо! я попытался поместить foreach в другое место, не думал об этом. Спасибо большое! :) –

+0

еще один квест. когда я нажимаю кнопку + несколько раз, шары растут медленнее. почему это ? это что-то с моими интервалами? –

+0

В Timer_Tick случае, когда Ball делает достаточно большим, вы просто меняете свой цвет на прозрачный. Просто сделайте Timer stop. – SerkanOzvatan