Обычно при использовании GDI + в Delphi вы можете использовать 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;
Проблема с этой парадигмой заключается в том, что создание уничтожающего объекта Graphics каждый раз является расточительным и неэффективным. Кроме того, есть несколько конструкций, доступных в GDI +, которые вы можете используйте только тогда, когда у вас есть постоянный объект Graphics.
Проблема, конечно, в том, когда я могу создать этот объект Graphics? мне нужно знать, когда дескриптор станет доступным, а затем, когда он больше не действителен. мне нужна эта информация, чтобы я мог создать и уничтожить свой объект Graphics.
Попытка решения №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.
Каков предполагаемый механизм в Delphi, чтобы я знал, когда создается, уничтожается или воссоздается дескриптор контекста устройства в TPaintBox?