Delphi - Graphics32, рисование сглаженного прямоугольника со скругленными углами

Как я могу нарисовать прямоугольник со сглаженными углами с закругленными углами, используя Graphics32?

Мне удалось сделать обычный прямоугольник с помощью TPolygon на холсте bitmap32, но я не могу найти никаких упоминаний о рисовании закругленных углов. Был бы признателен за код.


person hikari    schedule 27.12.2012    source источник


Ответы (1)


function GetRoundedFixedRectanglePoints(const Rect: TFloatRect; dx, dy: single): TArrayOfFixedPoint;
var
  i, j, k, arcLen: integer;
  arcs: array [0 .. 3] of TArrayOfFixedPoint;
begin
  //nb: it's simpler to construct the rounded rect in an anti-clockwise
  //direction because that's the direction in which the arc points are returned.

  with Rect do
  begin
    arcs[0] := GetArcPointsEccentric(
      FloatRect(Left, Bottom -dy*2, Left+dx*2, Bottom), rad180, rad270);
    arcs[1] := GetArcPointsEccentric(
      FloatRect(Right-dx*2, Bottom -dy*2, Right, Bottom), rad270, 0);
    arcs[2] := GetArcPointsEccentric(
      FloatRect(Right - dx*2, Top, Right, Top + dy*2), 0, rad90);
    arcs[3] := GetArcPointsEccentric(
      FloatRect(Left, top, Left+dx*2, Top+dy*2), rad90, rad180);

    //close the rectangle
    SetLength(arcs[3], Length(arcs[3])+1);
    arcs[3][Length(arcs[3])-1] := arcs[0][0];
  end;

  //calculate the final number of points to return
  j := 0;
  for i := 0 to 3 do
    Inc(j, Length(arcs[i]));
  SetLength(Result, j);

  j := 0;
  for i := 0 to 3 do
  begin
    arcLen := Length(arcs[i]);
    for k := 0 to arcLen -1 do
      Result[j+k] := arcs[i][k];
    Inc(j, arcLen);
  end;
end;

Использование:

var
  pts: TArrayOfFixedPoint;
begin    
  pts := GetRoundedFixedRectanglePoints(FloatRect(Left+2, Top+2, Left + Width-2, Top + Height-2), 5, 5);

  SimpleFill(ABitmap32, pts, 0, Color32(clBlack));  
person pani    schedule 27.12.2012
comment
Откуда все эти проки? это не похоже на часть GR32. - person hikari; 27.12.2012
comment
Библиотека GR32_Lines для Graphics32 (модуль GR32_Misc). Вы можете загрузить его с сайта angusj.com/delphi/gr32_lines.php. - person pani; 27.12.2012
comment
Ясно спасибо. Для этого нужно немного времени, похоже, что расширению нужны последние файлы SVN, а не официальная версия 1.91, которая удаляет TPolygon32 и конфликтует со всем моим кодом - проверим и вернемся к вам позже сегодня. - person hikari; 27.12.2012