我试图在 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);
}
}
但矩形没有第一次出现,但是当我使用鼠标更改窗体的大小时,我的矩形出现了原因?!!!
答案 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));
}
编辑:(回应评论)
如果要定期更新绘图箱,请执行以下操作:
Paint
PictureBox
事件中绘制场景
Invalidate
方法。它将导致Paint
事件触发并重新绘制场景。请记住,所有从线程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() ;
}