Delphi Paintbox Paint方法未更新图像画布[FMX]

问题描述

我正在跨平台的vnc项目。 Windows可以使用VCL。但是当我使用具有相同代码的FMX平台时,就会遇到问题。

procedure TFrmScreenView.pbViewPaint(Sender: TObject);
begin
  Client.DrawBitmap(pbView.Canvas);
end;

对于来自远程计算机的每个新图像包,此代码将更新为PaintBox Canvas。这样在VCL上工作没问题。但是当我在FMX图像上执行此项目时,重新绘制无法正常工作。它只会获取第一张图像,并且不会更新。

procedure TFrmScreenView.pbViewPaint(Sender: TObject; Canvas: TCanvas);
begin
  Client.DrawBitmap(pbView.Canvas);
end; 

客户代码

procedure TClient.DrawBitmap(Canvas: TCanvas);
  begin
  if assigned(Bitmap) then // Bitmap is global variable
    begin
    Canvas.DrawBitmap(Bitmap,RectF(0,Bitmap.Width,Bitmap.Height),1,True);
    end;
  end;

如果我使用计时器,则paintBox会为每个图像包进行更新

procedure TScreenViewFrm.Timer1Timer(Sender: TObject);
begin
  pbScreenView.Repaint;
end;

我必须在代码上使用Timer进行重绘,但我不希望这样做并且无法稳定工作。

***注意:当我调整ScreenView窗体的大小时,“ Paint”框正在更新。为什么?

你有什么主意吗?

示例捕获

https://gyazo.com/f880c2f172b0106122ea711389bf1659

解决方法

Client(我假设是数据包接收者)收到新图像并将其存储在全局Bitmap之后,请执行您现在在计时器中所做的操作:pbScreenView.Repaint;(并删除计时器)

,

用FMX在画布上绘制任何内容时,必须使用TCanvas.BeginScene并以TCanvas.EndScene结尾,否则将不会绘制任何内容。

procedure TClient.DrawBitmap(Canvas: TCanvas);
  begin
    if assigned(Bitmap) then // Bitmap is global variable
    begin
      if Canvas.BeginScene then begin
        try
          Canvas.DrawBitmap(Bitmap,Bitmap.Bounds,1,True);
        finally
          Canvas.EndScene;
        end;
      end;
    end;
  end;