Yo hago eso usando FillPath
(BeginPath, PolyBezierTo, CloseFigure, EndPath, FillPath)
Ejemplo de mi libreria
Código Delphi
[-]
procedure TRBezier.FillArea(Layer: TRLayer);
var i, ip1: Integer;
pt0, pt1, rpt, lpt: TPoint;
_pt0, _pt1, _rpt, _lpt: TPointF;
pts: array[0..3]of TPoint;
begin
BeginPath(Layer.Canvas.Handle);
Layer.Converter.LogicToScreen(X[Low], Y[Low], pt0.X, pt0.Y);
MoveToEx(Layer.Canvas.Handle, pt0.X, pt0.Y, nil);
for i := Low to High + Integer(Closed)-1 do
begin
ip1 := (i+1) mod Length;
_pt0 := PointF(X[i], Y[i]);
_pt1 := PointF(X[ip1], Y[ip1]);
Layer.Converter.LogicToScreen(X[ip1], Y[ip1], pt1.X, pt1.Y);
case SegmentType[i] of
stBezier:
begin
_rpt := RCtrlPt[i];
_lpt := LCtrlPt[ip1];
OffsetPointF(_rpt, _pt0.X, _pt0.Y);
OffsetPointF(_lpt, _pt1.X, _pt1.Y);
Layer.Converter.LogicToScreen(_rpt.X, _rpt.Y, rpt.X, rpt.Y);
Layer.Converter.LogicToScreen(_lpt.X, _lpt.Y, lpt.X, lpt.Y);
pts[1] := rpt;
pts[2] := lpt;
pts[3] := pt1;
PolyBezierTo(Layer.Canvas.Handle, pts[1], 3);
end;
stLine: PolyLineTo(Layer.Canvas.Handle, pt1, 1);
end;
end;
CloseFigure(Layer.Canvas.Handle);
EndPath(Layer.Canvas.Handle);
FillPath(Layer.Canvas.Handle);
end;