Firemonkey Delphi Paintbox绘制方法未更新图像画布[FMX]

Firemonkey Delphi Paintbox绘制方法未更新图像画布[FMX],firemonkey,repaint,paintbox,Firemonkey,Repaint,Paintbox,我正在从事跨平台vnc项目。Windows端可以使用VCL。但当我使用相同代码的FMX平台时,我遇到了问题 procedure TFrmScreenView.pbViewPaint(Sender: TObject); begin Client.DrawBitmap(pbView.Canvas); end; 此代码正在为来自远程计算机的每个新图像包更新到Paintbox画布。这对VCL的工作没有问题。但当我在FMX上执行此项目时,图像重新绘制不起作用。它只获取第一个图像,不进行更新 proc

我正在从事跨平台vnc项目。Windows端可以使用VCL。但当我使用相同代码的FMX平台时,我遇到了问题

procedure TFrmScreenView.pbViewPaint(Sender: TObject);
begin
  Client.DrawBitmap(pbView.Canvas);
end;
此代码正在为来自远程计算机的每个新图像包更新到Paintbox画布。这对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,0,Bitmap.Width, Bitmap.Height),
                             RectF(0,0,Bitmap.Width, Bitmap.Height),1,True);
    end;
  end;
如果我使用定时器,paintbox将为每个图像包更新

procedure TScreenViewFrm.Timer1Timer(Sender: TObject);
begin
  pbScreenView.Repaint;
end;
我必须使用定时器重新绘制我的代码,但我不想这样,工作不稳定

***注意:当我调整屏幕视图的大小时,表单绘制框正在更新。为什么?

你知道吗

示例捕获


客户端
(我假定是数据包接收器)接收到新图像并将其存储在全局
位图
中后,执行您现在在计时器中执行的操作:
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,Bitmap.Bounds,1,True);
        finally
          Canvas.EndScene;
        end;
      end;
    end;
  end;

请显示收到数据包后的代码。什么是
TScreenView
什么是
Client
嘿,汤姆,我编辑了我的代码。屏幕视图是FMX表单。客户端是一个用于解析某个进程的类。我试过了,但没用。有趣的是,我调试了我的代码并查看了PaintBox。Paint方法数据会立即出现,但不会重新绘制到PaintBox。为什么要在窗体上重新绘制?我不明白。提供一份工作怎么样。这样就可以用按钮模拟图像的接收。表单大小调整会触发表单上所有组件的更新。由计时器触发的重绘可以正常工作,但在代码中调用的重绘无法正常工作,这是不合逻辑的。谢谢Tom的帮助。我需要更多关注。我猜这似乎与线程有关。我不需要调用重绘,因为我在接收到的套接字上已经被这样触发pbScreenViewPaint(pbScreenView,pbScreenView.Canvas);//或者零。我去看看。再次感谢。