4

バックグラウンド

カスタムFireMonkeyGUIコントロールを構築しています。コントロールをバックバッファーにレンダリングしたい。バックバッファは、コントロールのキャンバスに描画されます。

  • バックバッファは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;
4

1 に答える 1

4

図面を次のように囲んでみてください。

BackBuffer.Canvas.BeginScene;
.. 
..
BackBuffer.Canvas.EndScene;
BackBuffer.BitmapChanged;

PS私はFireMonkeyスタイルにかなり慣れていないので、試してみて、うまくいったら書いてください!

于 2011-12-01T09:05:44.887 に答える