You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者שי כהן

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:46:07