-1

我正在工作跨平台 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,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;

我必须使用 Timer 在我的代码上重新绘制,但我不想要这个并且工作不稳定。

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

你有什么主意吗?

示例捕获

https://gyazo.com/f880c2f172b0106122ea711389bf1659

4

2 回答 2

0

在 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;
于 2020-08-21T13:13:19.500 回答
0

Client(我认为是数据包接收者)接收到新图像并将其存储在 globalBitmap之后,执行您现在在计时器中执行的操作:(pbScreenView.Repaint;并删除计时器)

于 2020-08-19T13:26:21.200 回答