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

WinForms中OnPaint里Graphics.DrawString文本不更新问题排查

问题原因

你的代码在调整窗体大小时文本未更新的核心原因是:Windows Forms默认只重绘客户区中发生变化的部分(即新增的区域),而你绘制的文本起始位置在未被重绘的原有区域,导致旧文本未被覆盖,看起来没有更新。

具体来说:

  • 调整窗体大小时,系统触发的OnPaint中,e.ClipRectangle仅包含新增的区域(而非整个客户区)
  • 你调用FillRectangle填充整个ClientRectangle,但受限于Graphics的裁剪区域,只会填充新增部分为黑色
  • 绘制文本时,同样只有裁剪区域内的部分会被重绘,而文本的核心内容(左上角的字符串)在原有区域,未被重新绘制,旧文本因此保留
解决方案

有两种简单的解决方式:

方式1:启用窗体的全重绘

在窗体构造函数中设置ResizeRedraw为true,让系统在调整大小时重绘整个客户区:

public Form1()
{
    InitializeComponent();
    ResizeRedraw = true;
}

方式2:强制绘制整个客户区

在OnPaint中手动设置Graphics的裁剪区域为整个客户区,确保所有内容都被重绘:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    // 设置裁剪区域为整个客户区
    e.Graphics.Clip = new Region(ClientRectangle);
    e.Graphics.FillRectangle(Brushes.Black, ClientRectangle);
    Console.WriteLine($"OnPaint: {ClientRectangle}");
    // 建议使用PointF指定绘制起始位置,避免布局矩形带来的歧义
    e.Graphics.DrawString($"{ClientRectangle}", Font, Brushes.White, new PointF(0, 0));
}

另外,建议你使用PointF来指定文本的绘制起始位置,而非ClientRectangle,这样更直观,避免因布局矩形的对齐规则产生意外问题。

内容的提问来源于stack exchange,提问作者Onkeltem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:35:06