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

调整PaintBox尺寸后同过程无法绘制图形的问题求助

解决PaintBox调整尺寸后无法立即绘制图形的问题

这个坑我之前在Delphi里踩过好几次!核心问题在于PaintBox在修改尺寸时会自动触发重绘(也就是OnPaint事件),默认的重绘逻辑会清空画布——你在调整尺寸后立刻调用的Canvas.Draw,会被系统后续的自动重绘给覆盖掉,所以看起来好像没生效。

两种可行的解决方案:

方案一:临时禁用重绘,避免画布被清空

通过发送WM_SETREDRAW消息,先让PaintBox暂停自动重绘,调整完尺寸并绘制图形后再恢复重绘。这样就能避免你的绘制操作被覆盖:

uses
  Windows; // 需要引入Windows单元来使用SendMessage

// 调整尺寸并绘制的代码块
SendMessage(PaintBox1.Handle, WM_SETREDRAW, 0, 0); // 禁用重绘
try
  PaintBox1.Width := PaintBox1.Width - 20;
  PaintBox1.Height := PaintBox1.Height - 20;
  BMP.Width := PaintBox1.Width;
  BMP.Height := PaintBox1.Height;
  PaintBox1.Canvas.Draw(0, 0, BMP, 255);
finally
  SendMessage(PaintBox1.Handle, WM_SETREDRAW, 1, 0); // 恢复重绘
  PaintBox1.Invalidate; // 强制刷新,确保图形显示
end;

方案二:将绘制逻辑移到OnPaint事件(更规范的长期方案)

PaintBox的设计初衷就是通过OnPaint事件维护显示内容——不管是尺寸变更、窗口被遮挡后恢复,还是其他需要重绘的场景,OnPaint都会自动触发。把你的绘制逻辑放到这里,就能彻底避免“绘制被覆盖”的问题:

首先,给PaintBox绑定OnPaint事件,写入以下代码:

procedure TYourForm.PaintBox1Paint(Sender: TObject);
begin
  // 确保BMP尺寸和PaintBox同步
  if (BMP.Width <> PaintBox1.Width) or (BMP.Height <> PaintBox1.Height) then
  begin
    BMP.Width := PaintBox1.Width;
    BMP.Height := PaintBox1.Height;
    // 可选:初始化BMP背景(比如填充白色,避免黑底)
    BMP.Canvas.Brush.Color := clWhite;
    BMP.Canvas.FillRect(Rect(0, 0, BMP.Width, BMP.Height));
  end;
  // 绘制BMP到PaintBox画布
  PaintBox1.Canvas.Draw(0, 0, BMP, 255);
end;

然后,调整尺寸的代码就可以简化成这样,不需要手动调用Canvas.Draw:

PaintBox1.Width := PaintBox1.Width - 20;
PaintBox1.Height := PaintBox1.Height - 20;

为什么你之前的尝试无效?

你单独写绘制过程在调整尺寸后执行,还是会被系统后续触发的OnPaint事件(默认清空画布)覆盖;而通过按钮触发绘制时,没有触发PaintBox的自动重绘,所以图形能正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:10:16