【问题标题】:Delphi Paintbox Paint method is not updating image canvas[FMX]Delphi Paintbox Paint 方法不更新图像画布[FMX]
【发布时间】:2020-12-08 15:28:09
【问题描述】:

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

如果我使用计时器,画框会为每个图像包更新

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

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

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

你有什么想法吗?

示例捕获

https://gyazo.com/f880c2f172b0106122ea711389bf1659

【问题讨论】:

  • 请出示您收到数据包后的代码。什么是TScreenView,什么是Client
  • 嘿汤姆,我编辑了我的代码。 ScreenView 是 FMX 表单。 Client 是一个用于解析某些进程的类。

标签: firemonkey repaint paintbox


【解决方案1】:

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

【讨论】:

  • 是的。我试过但没有工作。有趣的是,我调试了我的代码,我查看了 PaintBox.Paint 方法数据立即出现但没有重新绘制到油漆盒。为什么要在调整大小时重新绘制?我不明白。
  • 提供minimal reproducible example 怎么样。这样可以用按钮模拟图像的接收。表单调整大小会触发表单上所有组件的更新。
  • 由计时器触发的重绘会起作用但代码中调用的重绘不起作用是不合逻辑的
  • 感谢 Tom 的帮助。我需要更加专注。我猜这似乎与线程有关。我不需要调用 Repaint,因为我已经在收到 pbScreenViewPaint(pbScreenView, pbScreenView.Canvas ); // 或无。我会看看。再次感谢。
【解决方案2】:

在 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多