2016-07-12 4 views
4

Почему после рисования круги меняются цвета? , на самом деле, я рисую круги, но моя проблема заключается в том, что после каждого двойного щелчка цвет следующих кругов меняется с синего на цвет фона.Почему после рисования круги меняются цвета?

public Form1() 
    { 
     InitializeComponent(); 
     pictureBox1.Paint += new PaintEventHandler(pic_Paint); 
    } 

    public Point positionCursor { get; set; } 
    private List<Point> points = new List<Point>(); 
    public int circleNumber { get; set; } 

    private void pictureBox1_DoubleClick(object sender, EventArgs e) 
    { 
     positionCursor = this.PointToClient(new Point(Cursor.Position.X - 25, Cursor.Position.Y - 25)); 

     points.Add(positionCursor); 

     pictureBox1.Invalidate(); 
    } 

    private void pic_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     g.SmoothingMode = SmoothingMode.AntiAlias; 

     foreach (Point pt in points) 
     { 
      Pen p = new Pen(Color.Tomato, 2); 

      g.FillEllipse(Brushes.Blue, positionCursor.X, positionCursor.Y, 20, 20); 

      g.DrawEllipse(p, pt.X, pt.Y, 20, 20); 

      p.Dispose(); 
     } 
    } 

enter image description here

+1

Создать перо вне цикла, в [используя] (https://msdn.microsoft.com/en-us//library/yh598w02.aspx) заявление. Например, 'using (var pen = new Pen (Color.Tomato, 2) {/ * Остаток кода * /}'. Оператор 'using' вызывает метод' Dispose' на объекте правильным образом и (когда вы используете его, как показано выше), он также заставляет сам объект выйти из области действия, как только вызывается «Dispose». В блоке 'using' объект доступен только для чтения и не может быть изменен или переназначен. –

ответ

3

Вы тянете эллипсы правильно, но вы всегда заполнить только один из них (последний добавил, в позиции курсора).

// This is ok 
g.DrawEllipse(p, pt.X, pt.Y, 20, 20); 

// You should use pt.X and pt.Y here 
g.FillEllipse(Brushes.Blue, positionCursor.X, positionCursor.Y, 20, 20); 
0

изменение pic_Paint, как показано ниже

private void pic_Paint(object sender, PaintEventArgs e) 
     { 
      Graphics g = e.Graphics; 
      g.SmoothingMode = SmoothingMode.AntiAlias; 

      foreach (Point pt in points) 
      { 
       Pen p = new Pen(Color.Tomato, 2); 
       g.DrawEllipse(p, pt.X, pt.Y, 20, 20); 
       g.FillEllipse(Brushes.Blue, pt.X, pt.Y, 20, 20); 
       p.Dispose(); 
      } 

     } 
+0

Зачем создавать новое перо для каждой точки? Почему бы не использовать ту же ручку. – ja72

Смежные вопросы