Нарисуйте прозрачную рамку с помощью GDI + - PullRequest
0 голосов
/ 25 февраля 2019

Я хотел бы нарисовать прямоугольник, а затем вырезать в нем прозрачный круг, чтобы нарисовать круглую рамку на прямоугольном изображении.

Мои усилия:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...