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

Delphi PaintBox组件更改颜色后绘制异常的原因及解决方法

问题产生原因

  • 第一,你错误修改了TPaintBox的Color属性:Color是控件的背景色属性,在OnPaint绘制事件内修改该属性会直接触发控件新一轮重绘,形成无限重绘循环,这就是绘制卡顿闪烁的核心原因。同时修改背景色后,控件画布会被新的背景色整体填充,之前绘制的蛇身内容会被直接覆盖。
  • 第二,你混淆了背景色和绘制颜色的属性:FillRect填充矩形使用的是画布当前画刷的颜色,也就是Canvas.Brush.Color,而非控件的Color属性。你之前没有主动设置画刷颜色时,FillRect默认使用控件当前的背景色,所以第一次设置背景为绿色时,蛇身刚好显示为绿色;取消注释修改背景为红色后,重绘时画刷默认色也变成红色,所有绘制内容自然全部显示为红色。

正确实现方案

直接修改画布的画刷颜色即可,不要在OnPaint事件中修改控件的Color属性,修改后的代码如下:

procedure TForm1.PBPaint(Sender: TObject);
var
  Bean: TBean;
begin
  // 先绘制背景,可自定义背景色
  PB.Canvas.Brush.Color := clBlack;
  PB.Canvas.FillRect(PB.ClientRect);

  // 设置画刷为绿色,绘制蛇身
  PB.Canvas.Brush.Color := $008800;
  Bean := Snake.Head;
  while not (Bean = Snake.Tail) do
  begin
    PB.Canvas.FillRect(TRect.Create(Bean.x * 30, Bean.y * 30, Bean.x * 30 + 30, Bean.y * 30 + 30));
    Bean := Bean.Next;
  end;
  PB.Canvas.FillRect(TRect.Create(Bean.x * 30, Bean.y * 30, Bean.x * 30 + 30, Bean.y * 30 + 30));

  // 设置画刷为红色,绘制果实(Delphi颜色为BGR格式,$0000FF对应红色)
  PB.Canvas.Brush.Color := $0000FF;
  PB.Canvas.FillRect(TRect.Create(Fruit.x * 30, Fruit.y * 30,Fruit.x * 30 + 30,Fruit.y * 30 + 30));
end;

如果仍有轻微闪烁,可在窗体的OnCreate事件中开启双缓冲:PB.DoubleBuffered := True;,免费社区版Delphi完全支持该属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:27:01