如何在VCL中替换FMX的Bitmap.ClearRect方法?
问题描述
将FMX项目改写为VCL项目时,需要替换FMX中绘制二维码的ClearRect方法。原FMX代码如下:
for Column := 0 to QRCode.Columns - 1 do begin if QRCode.IsBlack[Row, Column] then QRCodeBitmap.ClearRect(TRectF.Create(PointF(Column, Row) * Scale, Scale, Scale), TAlphaColors.Black); end;
尝试了以下VCL代码但效果不符合预期:
if (QRCode.IsBlack[Row, Column]) then begin QRCodeBitmap.Canvas.Pixels[Column, Row] := clBlack; end else begin QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite; end;
解决方案
原FMX代码的ClearRect是绘制一个Scale×Scale大小的矩形来表示二维码的一个模块,而你尝试的VCL代码仅修改了单个像素,忽略了缩放逻辑,所以效果不对。在VCL中可以用Canvas.FillRect方法来实现相同的缩放绘制逻辑:
正确代码示例
var Rect: TRect; begin // 先初始化背景为白色,对应FMX未绘制区域的默认逻辑 QRCodeBitmap.Canvas.Brush.Color := clWhite; QRCodeBitmap.Canvas.FillRect(QRCodeBitmap.Canvas.ClipRect); for Row := 0 to QRCode.Rows - 1 do begin for Column := 0 to QRCode.Columns - 1 do begin if QRCode.IsBlack[Row, Column] then begin // 按Scale计算当前二维码模块的矩形区域 Rect.Left := Column * Scale; Rect.Top := Row * Scale; Rect.Right := Rect.Left + Scale; Rect.Bottom := Rect.Top + Scale; QRCodeBitmap.Canvas.Brush.Color := clBlack; QRCodeBitmap.Canvas.FillRect(Rect); end; end; end; end;
关键说明
- 背景填充:先将整个Bitmap填充为白色,避免残留旧的图像内容,和FMX中未绘制黑色模块的区域逻辑匹配。
- 缩放逻辑还原:每个二维码模块对应VCL中的一个
TRect,尺寸由Scale参数控制,和原FMX代码的缩放逻辑完全一致。 - 性能优化:使用
FillRect比逐个设置Pixels效率更高,尤其是处理大尺寸二维码时,不会出现卡顿问题。
内容的提问来源于stack exchange,提问作者W300I
相关产品推荐
相关产品推荐

