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
相关产品推荐
相关产品推荐

