Фон
Я / м строю пользовательский элемент управления FireMonkey GUI.Я хочу сделать элемент управления в обратном буфере.Задний буфер будет отрисован на холсте элемента управления.
Задний буфер - это объект Fmx.TBitmap.
Я использую заднийбуфер, потому что код рендеринга элемента немного задействован и не должен вызываться каждый раз, когда элемент управления перерисовывается.Задний буфер будет обновляться только при изменении некоторых свойств элемента управления.
Задача
Операции рисования BackBuffer.Canvas не имеют видимого эффекта.Однако очистка растрового изображения или установка значения пикселов растрового изображения по отдельности работают должным образом.
По какой-то причине объект BackBuffer.Canvas не будет отрисовываться на битовой карте заднего буфера.
- Мне кажется, я правильно установил требуемые свойства Canvas.Fill.
- Все проверенные мной свойства холста выглядят правильно.(Ширина холста / высота / и т. Д.)
Я извлек соответствующий код на случай, если он содержит некоторые подсказки.
TMyControl(TControl)
private
protected
BackBuffer : TBitmap;
procedure Paint; override;
procedure Resize; override;
public
constructor Create(AOwner: TComponent); override;
end;
constructor TMyControl.Create(AOwner: TComponent);
begin
inherited;
BackBuffer := TBitmap.Create(10, 10);
end;
procedure TFxSampleDisplay.Resize;
var
w, h : integer;
begin
inherited;
// Ensure BackBuffer is the same size as the control.
w := round(BoundsRect.Width);
h := round(BoundsRect.Height);
BackBuffer.SetSize(w,h);
end;
procedure TMyControl.Paint;
var
r : TRectF;
begin
inherited;
//******** This has visible results ********
BackBuffer.Clear($1100ff00); // Fill with semi-opaque green background
BackBuffer.Pixels[2,2] := $ffff0000; // Draw a red pixel
//******** This doesn't have visible results ********
r.Left := 0;
r.Top := 0;
r.Right := 50;
r.Bottom := 50;
BackBuffer.Canvas.Fill.Color := $ffff0000; // Set fill to RED.
BackBuffer.Canvas.Fill.Kind := TBrushKind.bkSolid;
BackBuffer.Canvas.FillRect(r, 10,10, AllCorners, 1);
//******** Draw the backbuffer on to the controls canvas ********
Canvas.DrawBitmap(BackBuffer, BoundsRect, BoundsRect, 1);
end;