2013-12-26 4 views
0

Я пытаюсь нарисовать прямоугольник на панели, но ничего не нарисовано. Ниже приведен код, показывающий, как я рисую прямоугольник на панели. В моем коде SetSelectionRect() используется для установки прямоугольника для рисования. Для них я использую следующие методы.Прямоугольник не может быть нарисован на панели мышью, перетаскивая время выполнения

private void Panel_MouseDown(object sender, MouseEventArgs e) 
    { 
     Point point = new Point(); 
     this.mouseDown = true; 
     this.Panel.SendToBack(); 

     point = this.Panel.PointToClient(Cursor.Position); 
     point.X = e.X; 
     point.Y = e.Y; 
     this.selectionStart.X = point.X; 
     this.selectionStart.Y = point.Y; 
    } 

    private void Panel_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (!this.mouseDown) 
     { 
      return; 
     } 
     else 
     { 
      this.mouseMove = true; 
      Point point = this.Panel.PointToClient(Cursor.Position); 
      point.X = e.X; 
      point.Y = e.Y; 
      this.selectionEnd.X = point.X; 
      this.selectionEnd.Y = point.Y; 
      this.SetSelectionRect(); 
      ////this.Panel.Invalidate(); 
      ////this.Invalidate(); 
     } 
    } 

    private void Panel_MouseUp(object sender, MouseEventArgs e) 
    { 
     SetSelectionRect(); 
     this.GetSelectedControls(); 
     this.mouseDown = false; 
     this.mouseMove = false; 
     ////this.Panel.Invalidate(); 
     ////this.Invalidate(); 
     this.Panel.Refresh(); 
    } 

    private void Panel_Paint(object sender, PaintEventArgs e) 
    { 
     ////base.OnPaint(e); drawRect = true when RectangleToolStripMenuItem is Clicked. 
     if (this.drawRect) 
     { 
      using (Pen pen = new Pen(Color.Black, 1F)) 
      { 

        this.rectangle = new RectangleShape(); 
        this.Panel.SendToBack(); 
        this.shapeContainer1.Shapes.Add(this.rectangle); 
        this.rectangle.Location = this.selection.Location; 
        this.rectangle.Size = this.selection.Size; 
        this.rectangle.Name = "rectShape"; 
        this.shapeContainer1.Size = this.Panel.Size; 
        this.shapeContainer1.Location = this.Panel.Location; 
        this.rectangle.Enabled = false; 
        this.rectangle.MouseClick += new MouseEventHandler(this.mouseclick); 
        this.rectangle.MouseMove += new MouseEventHandler(this.mouseMove); 
        this.rectangle.MouseDown += new MouseEventHandler(this.mouseDown); 
        this.rectangle.MouseUp += new MouseEventHandler(this.mouseUp); 
        this.drawRect = false; 
      } 
     } 
    } 

    protected override void OnPaint (PaintEventArgs e) 
    { 
     base.OnPaint(e); 
    } 

Что не так с кодом?

ответ

2

Проблема base.OnPaint(e); is raise Paint событие, в котором вы разместили base.OnPaint(e);, так что он вызывает себя снова и снова.

private void panel_Paint(object sender, PaintEventArgs e) 
{ 
    //base.OnPaint(e); // remove it from here 
    // something to do. 
} 

base.OnPaint(e); следует назвать в переопределен метод:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
} 
+0

Я попробовал. Но проблема в том, что мне нужна base.OnPaint (e), потому что у меня есть возможность добавить форму Rectangle во время выполнения панели (путем перетаскивания мышью). Без base.OnPaint (e) я не могу рисовать фигуры. – DhavalR

+0

Использовать метод Overriden OnPaint, см. Мой обновленный ответ. – Tony

+0

Отлично. Еще кое-что. См. Отредактированный вопрос. Прямоугольник не нарисован. Почему так? – DhavalR