问题描述
我正在跨平台的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;