Метод рисования Delphi Paintbox не обновляет холст изображения [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,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;
Мне нужно использовать таймер для перерисовки моего кода, но я не хочу этого и не работает стабильно.
*** Примечание. Когда я изменяю размер ScreenView, окно Paint обновляется. Зачем?
Есть ли у вас какие-либо идеи?
Пример захвата
2 ответа
После 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,Bitmap.Bounds,1,True);
finally
Canvas.EndScene;
end;
end;
end;
end;