覆盖油漆方法不能正常工作
本文关键字:工作 常工作 方法 不能 覆盖 | 更新日期: 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));
}
编辑:(回复评论)
如果要定期更新油漆盒,请执行以下操作:
- 将绘制场景所需的数据保留在表单的某个地方,可能作为私有字段
- 用这些数据绘制
PictureBox
中 - 当需要更新场景时,修改相应的数据,然后调用PictureBox的
Invalidate
方法。它将导致Paint
事件触发,场景将被重新绘制。
Paint
事件的场景请记住,线程对UI方法的所有调用必须与主UI线程同步(否则它们将无法工作或导致问题)。
当您绘制PictureBox
时,您正在重写表单的paint方法。事情不应该是这样的。PictureBox
仍然会做它自己的渲染。
如果你真的想绘制PictureBox
,实现PictureBox
的Paint
事件,或者创建一个自定义控件,在其中绘制矩形和图片
绘制表单后,使用以下命令刷新表单:-
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() ;
}