C#中使用FillPolygon在PictureBox绘制的图形被覆盖后消失的原因是什么?
问题描述
使用FillPolygon方法在PictureBox控件上绘制了一个三角形,但每当有其他窗口覆盖该控件区域,或者整个窗体最小化后重新显示时,绘制的三角形就会消失。这是什么原因?
示例代码
//以下代码示例: Graphics grf = PictureBox.CreateGraphics(); Point[] point = new Point[3]; //此处我填充了点的坐标值 // ... grf.FillPolygon(color, points); //三角形已成功绘制,但一旦操作的窗口被覆盖或移出屏幕就会消失
原因分析
你用PictureBox.CreateGraphics()获取的是临时绘图上下文,这种方式属于"即时绘制"——绘制的内容只存在于当前控件的表面缓存中,不会被系统记录为控件的持久化绘制内容。
当控件遇到需要重绘的场景(比如被其他窗口覆盖后重新显示、窗体最小化恢复、控件大小改变),Windows会触发控件的Paint事件,要求控件重新绘制自身。此时系统只会绘制PictureBox的默认内容(比如设置的Image或BackColor),之前通过临时Graphics对象画的三角形不会被重新渲染,所以就消失了。
解决方法
正确的做法是在PictureBox的Paint事件中完成绘制操作。每次控件需要重绘时,Paint事件都会被触发,我们可以利用事件参数提供的Graphics对象来绘制图形,这样就能保证重绘时三角形会被重新画出来。
修改后的代码示例
// 在窗体构造函数或者初始化方法中绑定Paint事件 public Form1() { InitializeComponent(); // 绑定PictureBox的Paint事件处理方法 pictureBox1.Paint += PictureBox1_Paint; } // PictureBox的Paint事件处理方法 private void PictureBox1_Paint(object sender, PaintEventArgs e) { // 使用事件参数里的Graphics对象,这是系统提供的用于重绘的上下文 Graphics grf = e.Graphics; Point[] points = new Point[3]; // 填充点的坐标,比如: points[0] = new Point(50, 50); points[1] = new Point(150, 50); points[2] = new Point(100, 150); Color color = Color.Red; grf.FillPolygon(new SolidBrush(color), points); }
如果需要动态更新三角形的位置或样式,可以在修改参数后调用pictureBox1.Invalidate()方法,手动触发控件的Paint事件,让图形重新绘制。
内容的提问来源于stack exchange,提问作者שי כהן
相关产品推荐
相关产品推荐

