我需要在 Delphi 中开发一个循环进度条,我不能使用第三方组件(公司政策)。我用画布,画一个弧线,这是工程罚款,但图像是在一个非常低的分辨率。有可能提高画布绘制的分辨率吗?
代码示例:
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;
结果:
我愿意听取其他解决办法的建议。
4条答案
按热度按时间7fyelxc51#
如果不允许使用任何具有抗锯齿功能的第三方图形库,请考虑使用GDI+,它包含在Windows中, Delphi 有一个 Package 器。
qncylg1j2#
不确定Direct2D是否已经存在于 Delphi 2007中,但使用Direct2D可能是一个更好的选择,因为它是使用GPU渲染的,而不是CPU。
af7jpaap3#
一个非常简单的解决方案是在临时位图上以更高的分辨率(如1.5x或2x)绘制圆,然后将其调整为您的分辨率(因为调整大小过程将向圆添加抗锯齿),最后直接将此位图绘制到画布上。实际上,许多算法都是这样工作来添加抗锯齿。
vhmi4jdf4#
您可以使用以下单元(正在进行中)您所需要做的就是将其添加到您的“uses”中,并且支持的TCanvas操作将转换为GDI+“魔术”是由TCanvas类助手完成的,它覆盖了所支持的函数:椭圆、多边形、多段线、线到、圆弧、Angular 圆弧