Firemonkey:tbitmap.canvas描画方法には、目に見える結果がありません。私は何が間違っているのですか?

StackOverflow https://stackoverflow.com/questions/8336127

質問

バックグラウンド

I/mカスタムFiremonkey GUIコントロールの構築。コントロールをバックバッファーにレンダリングしたいと思います。バックバッファーは、コントロールのキャンバスに描かれます。

  • バックバッファーはfmx.tbitmapオブジェクトです。

  • コントロールレンダリングコードは少し関与しており、コントロールが塗装されるたびに呼び出す必要がないため、バックバッファーを使用しています。バックバッファーは、一部の制御プロパティが変更された場合にのみ更新されます。

問題

backbuffer.canvas描画操作には、目に見える効果がありません。ただし、ビットマップをクリアするか、ビットマップピクセルの値を個別に設定すると、予想どおりに機能します。

何らかの理由で、backbuffer.canvasオブジェクトはバックバッファービットマップを描画しません。

  • 必要なキャンバスを設定したと思います。プロパティを正しく埋めます。
  • 私がチェックしたすべてのキャンバスプロパティは正しいようです。 (キャンバス幅/高さ/など)

いくつかの手がかりを含む場合に備えて、関連するコードを抽出しました。

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;
役に立ちましたか?

解決

絵を囲んでみてください:

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

PS私はFiremonkeyスタイルでかなり新しいので、試してみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top