Delphi:以高分辨率绘制圆弧

标签 delphi canvas vcl delphi-2007

我需要在delphi 2007中开发一个循环进度条,我不能使用第三方组件(公司政策)。 我正在使用 Canvas ,绘制弧线,效果很好,但图像的分辨率非常低。可以提高canvas绘图的分辨率吗?

代码示例:

procedure TForm1.DrawPieSlice(const Canvas: TCanvas; const Center: TPoint;
  const Radius: Integer; const StartDegrees, StopDegrees: Double);
 //Get it in http://delphidabbler.com/tips/148
const
  Offset = 90;
var
  X1, X2, X3, X4: Integer;
  Y1, Y2, Y3, Y4: Integer;
begin
  X1 := Center.X - Radius;
  Y1 := Center.Y - Radius;
  X2 := Center.X + Radius;
  Y2 := Center.Y + Radius;
  X4 := Center.X + Round(Radius * Cos(DegToRad(Offset + StartDegrees)));
  Y4 := Center.y - Round(Radius * Sin(DegToRad(Offset + StartDegrees)));
  X3 := Center.X + Round(Radius * Cos(DegToRad(Offset + StopDegrees)));
  Y3 := Center.y - Round(Radius * Sin(DegToRad(Offset + StopDegrees)));
  Canvas.Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4);
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
var
  Center: TPoint;
  Bitmap: TBitmap;
  Radius: Integer;
  p: Pointer;
begin
  Label1.Caption:= SpinEdit1.Text+'%';
  Bitmap := TBitmap.Create;
  try
    Bitmap.Width  := Image1.Width;
    Bitmap.Height := Image1.Height;
    Bitmap.PixelFormat := pf24bit;
    Bitmap.HandleType :=  bmDIB;
    Bitmap.ignorepalette := true;
    Bitmap.Canvas.Brush.Color := clBlack;
    Bitmap.Canvas.Pen.Color   := clHighlight;
    Bitmap.Canvas.Pen.Width   := 10;
    Center := Point(Bitmap.Width div 2, Bitmap.Height div 2);
    Radius := 61;
    DrawPieSlice(Bitmap.Canvas, Center, Radius,0,round(SpinEdit1.Value * -3.6));

    Image1.Picture.Graphic := Bitmap;
  finally
    Bitmap.Free;
  end;
end;

结果:

Sample

我愿意接受其他解决方案的建议。

最佳答案

如果不允许您使用任何具有抗锯齿功能的第三方图形库,请考虑使用 Windows 中包含的 GDI+,并且 Delphi 有一个它的包装器。

uses
  ..., GDIPAPI, GDIPOBJ, GDIPUTIL //included in Delphi standard modules

var
  graphics: TGPGraphics;
  SolidPen: TGPPen;
begin
  graphics := TGPGraphics.Create(Canvas.Handle);
  graphics.SetSmoothingMode(SmoothingModeAntiAlias);
  SolidPen := TGPPen.Create(MakeColor(255, 0, 0, 255), 31);
  SolidPen.SetStartCap(LineCapRound);
  SolidPen.SetEndCap(LineCapRound);
  graphics.DrawArc(SolidPen, 100, 100, 100, 100, 0, 270);
  graphics.Free;
  SolidPen.Free;

enter image description here

关于Delphi:以高分辨率绘制圆弧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41635622/

相关文章:

delphi - FireMonkey 中如何使用边距和填充?

Android PdfDocument.Page - 图像大小问题

delphi - 如何检查 TDateTime 内容是否有效

c++ - 在 C++ Builder XE2 中重命名 VCL Form 类

delphi - 可以快速打开并装有大量元素的组合盒

delphi - 在 BDS2006 中使用 Webbroker 来休息 Web 服务器

javascript - 了解 Canvas 中的 Javascript 异步 setInterval

c++ - 如何在 C++ Builder 中隐藏 PageControl TabSheets 的标题

Delphi XE - 我应该使用 String 还是 AnsiString?

javascript - SVG 污染 Canvas IE 安全错误 toDataURL