2012-12-27 50 views

回答

4
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)); 
+0

哪里都是来自这些特效?它似乎不是GR32的一部分。 – hikari

+0

用于Graphics32(GR32_Misc单元)的GR32_Lines库。你可以从http://www.angusj.com/delphi/gr32_lines.php下载它 – pani

+0

我明白了,谢谢。这需要一点时间,看起来扩展需要最新的SVN文件,而不是官方的1.91,它删除了TPolygon32,并与我所有的代码冲突 - - 将检查并在今天晚些时候回复。 – hikari