Firemonkey:tbitmap.canvas描画方法には、目に見える結果がありません。私は何が間違っているのですか?
-
26-10-2019 - |
質問
バックグラウンド
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スタイルでかなり新しいので、試してみてください。
所属していません StackOverflow