Я хотел бы нарисовать прямоугольник, а затем вырезать в нем прозрачный круг, чтобы нарисовать круглую рамку на прямоугольном изображении.
Мои усилия:
procedure TTheIndicator._drawFrame(b: TGPBitmap);
const
FRAME_WIDTH = 10;
var
g: TGPGraphics;
brush: TGPSolidBrush;
begin
g := TGPGraphics.Create(b);
try
brush := TGPSolidBrush.Create(MakeColor(255, 255, 255));
g.FillRectangle(brush, MakeRect(0, 0, b.GetWidth(), b.GetHeight()));
brush.SetColor(MakeColor(0, 255, 0, 255));
g.FillEllipse(brush, MakeRect(FRAME_WIDTH, FRAME_WIDTH, b.GetWidth()-FRAME_WIDTH*2, b.GetHeight()-FRAME_WIDTH*2));
finally
g.Free();
end;
end;
Этов результате получается белый прямоугольник.
В настоящее время я решаю задачу с помощью обходного пути.Я рисую круг с очень толстой линией:
procedure TTheIndicator._drawFrame(b: TGPBitmap);
const
FRAME_WIDTH = 20;
var
g: TGPGraphics;
pen: TGPPen;
cirDiam: Integer;
cirThick: Integer;
begin
g := TGPGraphics.Create(b);
//Circle line thickness is no more than a half of the longest side
cirThick := b.GetWidth();
if cirThick < b.GetHeight() then cirThick := b.GetHeight();
cirThick := cirThick div 2;
//Cicrle diameter is a size of a shortest side
cirDiam := b.GetWidth();
if cirDiam > b.GetHeight() then cirDiam := b.GetHeight();
pen := TGPPen.Create(MakeColor(255, 255, 255), cirThick);
try
g.DrawEllipse(
pen,
(b.GetWidth() - cirDiam - cirThick) div 2 + FRAME_WIDTH,
(b.GetHeight() - cirDiam - cirThick) div 2 + FRAME_WIDTH,
cirDiam + cirThick - FRAME_WIDTH * 2,
cirDiam + cirThick - FRAME_WIDTH * 2
);
finally
pen.Free();
g.Free();
end;
end;