覆盖油漆方法不能正常工作

本文关键字:工作 常工作 方法 不能 覆盖 | 更新日期: 2023-09-27 18:06:15

我试图在PictureBox上画一个矩形,而不使用Paint事件的PictureBox,所以我覆盖了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);
        }
    }

但矩形不出现在第一次,但当我改变窗体的大小使用鼠标我的矩形出现了为什么?!!

覆盖油漆方法不能正常工作

我理解您想使用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();
}

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

实现PictureBox的OnPaint事件,然后你将不必手动创建图形对象-只需使用事件参数提供的一个。

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. 用这些数据绘制PictureBox
  3. Paint事件的场景
  4. 当需要更新场景时,修改相应的数据,然后调用PictureBox的Invalidate方法。它将导致Paint事件触发,场景将被重新绘制。

请记住,线程对UI方法的所有调用必须与主UI线程同步(否则它们将无法工作或导致问题)。

当您绘制PictureBox时,您正在重写表单的paint方法。事情不应该是这样的。PictureBox仍然会做它自己的渲染。

如果你真的想绘制PictureBox,实现PictureBoxPaint事件,或者创建一个自定义控件,在其中绘制矩形和图片

绘制表单后,使用以下命令刷新表单:-

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() ; 
    }