通常、DelphiでGDI +を使用すると、TPaintBoxを使用して、OnPaintイベント中にペイントできます。
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
g: TGPGraphics;
begin
g := TGPGraphics.Create(PaintBox1.Canvas.Handle);
try
g.DrawImage(FSomeImage, 0, 0);
finally
g.Free;
end;
end;
このパラダイムの問題は、毎回グラフィックスオブジェクトを破棄することは無駄であり、パフォーマンスが低いことです。さらに、GDI +には、永続的なGraphicsオブジェクトがある場合にのみ使用できるいくつかの構成があります。
もちろん、問題はいつそのGraphicsオブジェクトを作成できるかということです。ハンドルがいつ使用可能になり、いつ無効になるかを知る必要があります。Graphicsオブジェクトを作成および破棄できるように、この情報が必要です。
ソリューションの試みNº1
作成の問題は、本当に必要なときに作成することで解決できます。最初にペイントサイクルが呼び出されたときは、次のようになります。
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
if FGraphics = nil then
FGraphics := TGPGraphics.Create(PaintBox1.Canvas.Handle);
FGraphics.DrawImage(FSomeImage, 0, 0);
end;
ただし、デバイスコンテキストが無効になる時期を知る必要があるため、FGraphcisオブジェクトを破棄して、次に必要になったときに再作成できるようにすることができます。何らかの理由でTPaintBoxのデバイスコンテキストが再作成された場合、次にOnPaintが呼び出されたときに、無効なデバイスコンテキストを利用します。
TPaintBoxのデバイスコンテキストハンドルがいつ作成、破棄、または再作成されるかを知るために、Delphiで意図されているメカニズムは何ですか?