覆盖绘制方法无法正常工作

时间:2014-06-02 07:40:57

标签: c# winforms

我试图在 PictureBox 上绘制一个矩形而不使用picturebox的 Paint 事件,所以我重写 Onpaint 方法:

   public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Invalidate();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics dc = pictureBox1.CreateGraphics();
            Pen bPen=new Pen(Color.Blue,3);
            dc.DrawRectangle(bPen,0,0,50,50);
        }
    }

但矩形没有第一次出现,但是当我使用鼠标更改窗体的大小时,我的矩形出现了原因?!!!

4 个答案:

答案 0 :(得分:2)

我知道你想要使用PictureBox的Paint事件。由于表单在包含元素之前呈现,因此您的代码将无效。

我为您提供了一个解决方案:绘制位图,然后通过 Image 公共成员将该位图插入PictureBox。

private void loadDrawing(){
  Bitmap map = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height);
  var graph = Graphics.FromImage(map);
  graph.DrawRectangle(new Pen(Color.Blue, 3), 0, 0, 50, 50);
  pictureBox1.Image = map;
}

假设你想让矩形在加载时出现:

private void Form1_Load(object sender, EventArgs e)
{
    loadDrawing();
}

答案 1 :(得分:1)

问题是您覆盖表单OnPaint方法而不是PictureBox的Paint事件。当表单需要重新绘制时,表单的OnPaint会发生,而这与PictureBox的情况无关。

实现PictureBox的OnPaint事件,然后您不必手动创建Graphics对象 - 只需使用事件参数中提供的对象。

private void Form1_Load(object sender, EventArgs e)
{
    // No need to do that
    // pictureBox1.Invalidate();
}

private void pictureBox1_Paint(object sender, PaintEventArgs e) {

    e.Graphics.DrawRectangle(Pens.Black, new Rectangle(10, 10, 20, 20));
}

编辑:(回应评论)

如果要定期更新绘图箱,请执行以下操作:

  1. 保留在表单中某处绘制场景所需的数据,可能是私有字段
  2. 使用这些数据在Paint
  3. PictureBox事件中绘制场景
  4. 当您需要更新场景时,请相应地修改数据,然后调用PictureBox的Invalidate方法。它将导致Paint事件触发并重新绘制场景。
  5. 请记住,所有从线程has to be synchronized to the main UI thread调用UI方法(否则它们将无法工作或导致问题)。

答案 2 :(得分:0)

在绘制PictureBox时,您将覆盖表单的paint方法。这不是它的意思。 PictureBox仍会自行渲染。

如果你真的想要对PictureBox进行绘画,请实现PictureBox的{​​{3}}事件,或者在绘制矩形和图片的位置创建自定义控件。

答案 3 :(得分:-1)

绘制表单后,使用以下方法刷新表单: -

protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        Graphics dc = pictureBox1.CreateGraphics();
        Pen bPen=new Pen(Color.Blue,3);
        dc.DrawRectangle(bPen,0,0,50,50);
        this.Refresh() ; 
    }