Мерцание при рисовании мышью на MouseMove

Используя GDI+ и C#, я пытаюсь нарисовать прямоугольник с помощью движения мыши на панели (называемой DrawingPanel), я также использую двойную буферизацию. Мышь движется.

Вот мой код...

Rectangle mRect = new Rectangle();
Boolean isDragging = false;

public Form1()
{
   InitializeComponent();
   this.DrawingPanel.Paint += new PaintEventHandler(this.OnPanelPaint);
   this.DrawingPanel.MouseMove += new MouseEventHandler(this.OnPanelMouseMove);
   this.DrawingPanel.MouseDown += new MouseEventHandler(this.OnPanelMouseDown);
   this.DrawingPanel.MouseUp += new MouseEventHandler(this.OnPanelMouseUp);
   this.DoubleBuffered = true;
}

private void OnPanelPaint(object sender, PaintEventArgs e)
{
   using (Graphics g = this.DrawingPanel.CreateGraphics()) 
   {
      g.DrawRectangle(Pens.Black, mRect);
      g.FillRectangle(Brushes.SkyBlue, mRect);
   }
}


private void OnPanelMouseMove(object sender, MouseEventArgs e)
{
    if(isDragging)
    {
      mRect = new Rectangle(mRect.Left, mRect.Top, e.X - mRect.Left, e.Y - mRect.Top);
      this.DrawingPanel.Invalidate();
    }
}

private void OnPanelMouseDown(object sender, MouseEventArgs e)
{
    mRect = new Rectangle(e.Location, new Size(0, 0));
    this.DrawingPanel.Invalidate();
    isDragging = true;
}

private void OnPanelMouseUp(object sender, MouseEventArgs e)
{
    isDragging = false;
}

Любая идея, почему это происходит до сих пор?


person Pankaj    schedule 12.02.2013    source источник
comment
как насчет изменения кода в OnPanelMouseDown и выполнения метода InValidate() в Forms MouseMove Event, поэтому вместо this.DrawingPanel.Invalidate(); просто вызовите Invalidate() посмотрите, поможет ли это   -  person MethodMan    schedule 13.02.2013
comment
Спасибо @DJKRAZE за ваш ответ, я изменил свой код OnPanelMouseDown на этот... private void OnPanelMouseDown(object sender, MouseEventArgs e) { isDragging = true; mRect = новый прямоугольник (e.Location, новый размер (0, 0)); } но все тот же эффект. :(   -  person Pankaj    schedule 13.02.2013
comment
Использование CreateGraphics() вместо e.Graphics в обработчике события Paint в корне неверно. Панель также не имеет двойной буферизации. См. stackoverflow.com/questions/3113190/   -  person Hans Passant    schedule 13.02.2013
comment
Pankaj - проверьте эту ссылку. Я протестировал код здесь и не мерцал. stackoverflow.com/questions/2608909/c-sharp-graphics-flickering используйте это, чтобы исправить свой вариант использования.   -  person MethodMan    schedule 13.02.2013
comment
Спасибо @DJKRAZE, я проверю код, который вы разместили, однако, когда я использую другой класс под названием BufferedPanel, как указано в ссылке, опубликованной Гансом, он работает нормально. Спасибо @Hans Passant.   -  person Pankaj    schedule 13.02.2013