簡體   English   中英

德爾福畫一個光滑的餡餅

[英]Delphi drawing a smooth pie

有人在Delphi中有用於在畫布上繪制平滑派的代碼嗎?

我在網上只能找到平滑線條的示例,但這對我沒有多大幫助。我也考慮過Gr32,但是對於我所需要的,它為我的應用程序增加了很大的空間。 我只需要在畫布上畫一個填充的餅,看起來不像默認情況下那樣糟糕

Canvas.Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4);

我使用Delphi XE,所以沒有Firemonkey ...

編輯 在此處輸入圖片說明

根據您的建議@johan,使用以下代碼獲取左側的餅圖:

procedure TForm1.Button4Click(Sender: TObject);
var
    Center:TPoint;
    Radius:integer;
    Bmp: TBitmap;
    MF: TMetaFile;
    MetafileCanvas: TMetafileCanvas;
begin
  MF := TMetaFile.Create;
  MF.Width := 150;
  MF.Height := 150;

  MetafileCanvas := TMetafileCanvas.Create(MF, 0);
  MetafileCanvas.Pen.Color := clRed;
  MetafileCanvas.Brush.Color := clRed;
  MetafileCanvas.Brush.Style := bsSolid;
  MetafileCanvas.Pie(0,0,150, 150, 150,50, 150,50);

  MetafileCanvas.Free;

  Bmp := Gdip.DrawAntiAliased(MF);
  Image2.Picture.Assign(Bmp);
  Bmp.Free;
  MF.Free;
end;

謝謝

使用GDI +可以很容易地做到這一點。 關鍵是使用SmoothingModeAntiAlias

uses GDIPAPI, GDIPOBJ;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  b: TGPBrush;
  r: TGPRect;
begin
  r := MakeRect(10, 10, ClientWidth - 20, ClientHeight - 20);
  g := TGPGraphics.Create(Canvas.Handle);
  g.SetSmoothingMode(SmoothingModeAntiAlias);  
  b := TGPSolidBrush.Create(aclGreen);
  p := TGPPen.Create(aclRed, 1);
  g.FillPie(b, r, 45, 90);
  g.DrawPie(p, r, 45, 90);
  b.Free;
  p.Free;
  g.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Invalidate;
end;

經過Delphi5測試

產量

要進行抗鋸齒繪制,可以使用:synopse gdiplus庫,請參閱: http ://synopse.info/fossil/wiki?name=GDI%2B

這是一個例子:

implementation

uses 
  SynGDIPlus;  //provides gdip (see below)

procedure TForm1.FormResize(Sender: TObject);
var Bmp: TBitmap;
    MF: TMetaFile;
    MetafileCanvas: TMetafileCanvas;
begin
  MF := TMetaFile.Create;
  MF.Width := 300;
  MF.Height := 200;

  MetafileCanvas := TMetafileCanvas.Create(MF, 0);
  MetafileCanvas.Brush.Color := clRed;
  MetafileCanvas.Brush.Style := bsDiagCross;
  MetafileCanvas.Pie(0,0,50, 50, 300,50, 200,50);
  MetafileCanvas.Free;

  Bmp := Gdip.DrawAntiAliased(MF);
  Image1.Picture.Assign(Bmp);
  Bmp.Free;
  //Image1.Picture.Assign(MF);

  MF.Free;
end;

使用此單元,您只需拉入單個單元,僅此而已。
您不必使用圖元文件,也可以直接繪制到DC,但是SynGDIPlus在內部使用圖元文件。

更快的選擇
如果性能是一個問題,則Graphics32庫將更快。
http://graphics32.org/wiki/

我認為您過於擔心graphics32的占用空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM