Einzelnen Beitrag anzeigen

Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
265 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: GDI+ und AntiAliasing: mal geht' s, mal nicht

  Alt 3. Mai 2012, 07:30
Guten Morgen,

ich habe mir eine Prozedur erstellt, um einen Kreis mit einem Loch zu zeichnen. Ich habe es ähnlich wie du gemacht und habe um einen außeren Rand mit AA zu bekommen, einfach eine Ellipse drüber gezeichnet.

Das Problem ist nur, das es beim inneren Kreis nicht funktioniert. Es bleibt immernoch dieser hässliche Rand.

Delphi-Quellcode:
procedure TForm1.DrawGradiantEllipse(Handle: HDC; X, Y, Width, Height,
  RingWidth: integer; OuterColor, InnerColor: cardinal; UseGradient: boolean);
var
  g: TGPGraphics;
  pBrush: TGPPathGradientBrush;
  region: TGPRegion;
  pen: TGPPen;
  OuterRect: TGPRect;
  InnerRect: TGPRect;
  InnerPath: TGPGraphicsPath;
  OuterPath: TGPGraphicsPath;
  Count: integer;
  white:cardinal;
  FocusScale: double;
begin
  g := TGPGraphics.Create(Handle);
  region := TGPRegion.Create;
  pBrush := TGPPathGradientBrush.Create;
  pen := TGPPen.Create(OuterColor, RingWidth);
  try
    FocusScale := 1 - (RingWidth / Width);
    g.SetSmoothingMode(SmoothingModeAntiAlias);
    if UseGradient then
    begin
      // Create Outer/Inner Rect
      OuterRect := MakeRect(x,y,Width,Height);
      InnerRect := MakeRect(OuterRect.X + RingWidth div 2,
                            OuterRect.Y + RingWidth div 2,
                            OuterRect.Width - RingWidth,
                            OuterRect.Height - RingWidth);
      // Create Outer/Inner Ellipse Path
      InnerPath := TGPGraphicsPath.Create;
      OuterPath := TGPGraphicsPath.Create;
      InnerPath.AddEllipse(InnerRect);
      OuterPath.AddEllipse(OuterRect);
      // Create PathGradientBrush
      pBrush := TGPPathGradientBrush.Create(OuterPath);
      pBrush.SetCenterColor(InnerColor);
      // Always a single Color
      count := 1;
      pBrush.SetSurroundColors(@OuterColor,count);
      pBrush.SetFocusScales(FocusScale,FocusScale);
      pBrush.SetBlendTriangularShape(0.5,FocusScale);
      // Create Region of InnerPath
      region := TGPRegion.Create(InnerPath);
      // "Erases" the Inner Ellipse
      g.SetClip(region,CombineModeExclude);
      g.FillEllipse(pBrush,OuterRect);
      // Set PenWidth for Ellipse with AA
      pen.SetWidth(1);
      pen.SetColor(MakeColor(225,0,255,0)); // Just for Debug
      g.DrawEllipse(pen,x + Ringwidth div 2,y + Ringwidth div 2,Width - Ringwidth,Height - Ringwidth);
    end;
    pen.SetColor(MakeColor(225,255,0,0)); // Just for Debug
    g.DrawEllipse(pen,x,y,Width,Height);
  finally
    region.Free;
    pBrush.Free;
    g.Free;
    pen.Free;
  end;
end;
Wüßte jemand wie man das Problem lösen kann?
Miniaturansicht angehängter Grafiken
screenshot_03.05.2012_08_24_42.jpg  
Delphi programming is awesome.
  Mit Zitat antworten Zitat