Delphi 圆圈图形进度条控件

List item

unit CircleProgress;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;

const
FORE_COLOR = clTeal;
BACK_COLOR = clSilver;
PEN_WIDTH = 4;

type
TCircleProgress = class(TGraphicControl)
private
{ Private declarations }
FMinValue: Longint;
FMaxValue: Longint;
FCurValue: Longint;
FPenWidth: Integer;
FShowText: Boolean;
FForeColor: TColor;
FBackColor: TColor;
FFullCover: Boolean;

procedure SetShowText(const Value: Boolean);
procedure SetForeColor(const Value: TColor);
procedure SetBackColor(const Value: TColor);
procedure SetFullCover(const Value: Boolean);
procedure SetMinValue(const Value: Longint);
procedure SetMaxValue(const Value: Longint);
procedure SetProgress(const Value: Longint);
procedure SetPenWidth(const Value: Integer);
//绘制
procedure DrawBackground(const ACanvas: TCanvas);
procedure DrawProgress(const ACanvas: TCanvas);

protected
{ Protected declarations }
procedure Paint; override;
procedure Resize; override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
property Align;
property Anchors;
property BackColor: TColor read FBackColor write SetBackColor default BACK_COLOR;
property FullCover: Boolean read FFullCover write SetFullCover default False;
property Color;
property Constraints;
property Enabled;
property ForeColor: TColor read FForeColor write SetForeColor default FORE_COLOR;
property Font;
property MinValue: Longint read FMinValue write SetMinValue default 0;
property MaxValue: Longint read FMaxValue write SetMaxValue default 100;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PenWidth: Integer read FPenWidth write SetPenWidth;
property PopupMenu;
property Progress: Longint read FCurValue write SetProgress;
property ShowHint;
property ShowText: Boolean read FShowText write SetShowText default True;
property Visible;
end;

procedure Register;

implementation

uses
Math, Consts, GDIPOBJ, GDIPAPI;

procedure Register;
begin
RegisterComponents(‘Samples’, [TCircleProgress]);
end;

{ TCircleProgress }

constructor TCircleProgress.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

ControlStyle := ControlStyle + [csFramed, csOpaque];
{ default values }
FMinValue := 0;
FMaxValue := 100;
FCurValue := 0;
FShowText := True;
FForeColor := FORE_COLOR;
FBackColor := BACK_COLOR;
FPenWidth := PEN_WIDTH;
Width := 100;
Height := 100;
end;

procedure TCircleProgress.DrawBackground(const ACanvas: TCanvas);
var
g: TGPGraphics;
p: TGPPen;
r: TGPRectF;
pw: Integer;
begin
//背景
ACanvas.Brush.Color := Self.Color;
//ACanvas.FillRect(Self.ClientRect);
ACanvas.Ellipse(0,0,Width,Height);
//轨道
g := TGPGraphics.Create(ACanvas.Handle);
pw := FPenWidth;
if not FFullCover then
Inc(pw, 2);
p := TGPPen.Create(ColorRefToARGB(FBackColor), pw);
try
r := MakeRect(pw / 2, pw / 2, Self.Width - pw - 1, Self.Height - pw - 1);
g.SetSmoothingMode(SmoothingModeAntiAlias);
g.DrawEllipse(p, r);
finally
p.Free;
g.Free;
end;
end;

procedure TCircleProgress.DrawProgress(const ACanvas: TCanvas);
procedure DrawPercent(g: TGPGraphics);
var
percent: Integer;
sb: TGPSolidBrush;
fm: TGPFontFamily;
f: TGPFont;
sf: TGPStringFormat;
begin
percent := Round(FCurValue * 100 / (FMaxValue - FMinValue));
sb := TGPSolidBrush.Create(ColorRefToARGB(Font.Color));
fm := TGPFontFamily.Create(Self.Font.Name);
f := TGPFont.Create(fm, Self.Font.Size, FontStyleRegular, UnitPoint);
sf := TGPStringFormat.Create();
sf.SetAlignment(StringAlignmentCenter);
sf.SetLineAlignment(StringAlignmentCenter);
g.DrawString(Format(‘%d%’, [percent]), -1, f, MakeRect(0.0, 0.0, Self.Width, Self.Height), sf, sb);
end;

var
g: TGPGraphics;
p: TGPPen;
pw: Integer;
r: TGPRectF;
angle: Single;
begin
g := TGPGraphics.Create(ACanvas.Handle);
p := TGPPen.Create(ColorRefToARGB(FForeColor), FPenWidth);
try
pw := FPenWidth;
if not FFullCover then
pw := pw + 2;
r := MakeRect(pw / 2, pw / 2, Self.Width - pw - 1, Self.Height - pw - 1);

g.SetSmoothingMode(SmoothingModeHighQuality);
angle := (FCurValue - FMinValue) * 360 / FMaxValue;
g.DrawArc(p, r, -90, angle);

//画百分比
if FShowText then
  DrawPercent(g);

finally
p.Free;
g.Free;
end;
end;

procedure TCircleProgress.Paint;
begin
inherited;

//bmp := TBitmap.Create;
try
//bmp.Height := Height;
//bmp.Width := Width;
//DrawBackground(Canvas);
DrawProgress(Canvas);

//Canvas.CopyMode := cmSrcCopy;
//Canvas.Draw(0, 0, bmp)

finally
//bmp.Free;
end;
end;

procedure TCircleProgress.ReSize;
begin
inherited;

if FPenWidth > Self.Width div 2 - 1 then
begin
FPenWidth := Self.Width div 2 - 1;
Invalidate;
end;
end;

procedure TCircleProgress.SetBackColor(const Value: TColor);
begin
if FBackColor <> Value then
begin
FBackColor := Value;
Invalidate;
end;
end;

procedure TCircleProgress.SetForeColor(const Value: TColor);
begin
if FForeColor <> Value then
begin
FForeColor := Value;
Invalidate;
end;
end;

procedure TCircleProgress.SetFullCover(const Value: Boolean);
begin
if FFullCover <> Value then
begin
FFullCover := Value;
Invalidate;
end;
end;

procedure TCircleProgress.SetMaxValue(const Value: Integer);
begin
if FMaxValue <> Value then
begin
if Value < FMinValue then
if not (csLoading in ComponentState) then
raise EInvalidOperation.CreateFmt(SOutOfRange, [FMinValue + 1, MaxInt]);

FMaxValue := Value;
if FCurValue > Value then FCurValue := Value;
Invalidate;

end;
end;

procedure TCircleProgress.SetMinValue(const Value: Integer);
begin
if FMinValue <> Value then
begin
if Value > FMaxValue then
if not (csLoading in ComponentState) then
raise EInvalidOperation.CreateFmt(SOutOfRange, [-MaxInt, FMaxValue - 1]);

FMinValue := Value;
if FCurValue < Value then FCurValue := Value;
Invalidate;

end;
end;

procedure TCircleProgress.SetPenWidth(const Value: Integer);
begin
if FPenWidth <> Value then
begin
FPenWidth := Value;
if FPenWidth < 1 then
FPenWidth := 1
else if FPenWidth > Self.Width div 2 - 1 then
FPenWidth := Self.Width div 2 - 1;
Invalidate;
end;
end;

procedure TCircleProgress.SetProgress(const Value: Integer);
begin
iF FCurValue <> Value then
begin
FCurValue := Value;
if FCurValue < FMinValue then
FCurValue := FMinValue
else if FCurValue > FMaxValue then
FCurValue := FMaxValue;

Invalidate;

end;
end;
procedure TCircleProgress.SetShowText(const Value: Boolean);
begin
if FShowText <> Value then
begin
FShowText := Value;
Invalidate;
end;
end;

procedure TCircleProgress.SetShowText(const Value: Boolean);
begin
if FShowText <> Value then
begin
FShowText := Value;
Invalidate;
end;
end;

end.

{{{DA2450F85EFC24A937F658F75EFD0A157595F62A7AE760FA5985B1124FB5E67FD8385DBDDCCE364276B3D715B610BDCAE6C9E128AE2CA03A98C4D77684C40E4E8CCB3061A5E62A6CA2E32B6F9C95F4137C9C8F9637ADD13C6E99F80859B24A9DE7197E808ADD246EE378E171EF61A185D93BA4E8117ED13C5EB3E36BED6AEB116CADF923AC27AED8CCCEC3D371D57B8B95A225AF1962A0F61866A9E810065CB31EAF7AD873DB0C41568ACF0E0E4289379CF815127490FE1FBE19BE144F4D80D50942425C23BD114781C43B6EA9EA3E6EA5D5DBD6E77BC20356A53F8ACD087193F252FF4E4F84B2174C819E339B3A5FF16CE560E17ED33AFD409BEE2F9531AEDAD4EDC63B9DC7728894E42363A6EF11679CE3275CABEA1D63918D8DE5255AAFE6245CA3E52F48BDD63450DF266D98EF117EF0040A7E828CF8176F8C8FF4007A81F50206080F74868EF6050A76F01A6BA4E42A59A9DB266A9BE42D59BDC9A5D92662A7D23B98CF7A8BA88AA5D87FD762F56CB514B522A3D6CBCFC1D975DA7CD913BB2BAEDACDC7C4C2C1D0C00F729BEB3634564E57F71C758195FB02021C0AB9D8313161A5EC3E6FE7296F9FF2177F998291303E5CAFE82B6AB5E660A2E12F69ABD93963DC61A0E4365A4556F31A64B6D3325B4E5693F7031C7F9089CBCB3A6F96FE19021177EC2E9731A73C99E4C7E2D825A026A222BEA3E71278DA7BC90B59A482BCFD0C4A8FC663E1349BCD0A56A0F49BB243373315E4F448B4F73B754FB229BC194D5DF363E97C81FCE3A74B39DCB14B041FE7FFE898F82870BC17B0117F905C3932DDA17D7C5544CA8A04FB130C1DB7117DA9EC2D6BA4EC18759F8B8C8C84868D9685C3004185FA2B5DA7EF7F9385C30742465BF559FE5FA1E62F9535F3104B8D31A52B6AFB58F61641983B9E2ECC1D7DDC60FC2675DC72D13F59BFD8CBC25E595567414C8AD870E63492CB0F4DB9E3E7A74438DDB8461E700D3533E33B64B71324A12F55462AEE8A7115F38A4947C59E5742594D548CCD3267ABE82465AFEB2465A091F01271A2F35DFF448BFB2E5FA0E92973CC70D4788497399E25A6D3335AE766EE25CD05419D3B5882C206065AF759FD4C82DC548E359B8C9D2ABD1866BBDBC5D33A4B60350C7E94CA0C4284C2320C265ABF0B4980ABDB}}}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Delphi中,我们可以通过使用自定义绘制和美化进度条来提升应用程序的外观。 第一步是自定义绘制。我们可以使用TProgressBar组件的OnCustomDraw事件来自定义绘制进度条。在这个事件中,我们可以使用Canvas属性来绘制自定义的外观。例如,我们可以使用渐变色、纹理或图像来绘制进度条的背景和填充。 第二步是美化进度条的外观。我们可以使用Delphi资源文件(.res)来包含进度条需要使用的样式和图像。通过将这些样式和图像添加到资源文件中,我们可以实现更多的个性化效果。然后,我们可以在进度条的OnCustomDraw事件中使用这些资源来绘制进度条。 另外,我们还可以为进度条添加动画效果。例如,我们可以使用Timer组件来定时改变进度条的值,从而实现进度条的动态效果。我们可以在Timer的OnTimer事件中更新进度条的值,并重绘进度条以显示新的进度。 此外,如果需要更高级的美化效果,也可以考虑使用第三方组件库。Delphi上有许多第三方组件库可用于美化进度条,例如TMS VCL UI Pack、DevExpress VCL等。这些组件库提供了各种预设的进度条样式和动画效果,可以简化美化进度条的工作。 综上所述,通过使用Delphi的自定义绘制功能、资源文件、动画效果和第三方组件库,我们可以很容易地美化进度条,提升应用程序的外观,使其更具个性化和吸引力。 ### 回答2: Delphi是一种以Object Pascal为基础的可视化编程环境,它允许开发者创建Windows应用程序和GUI界面。在Delphi中,进度条是一种常用的控件,用于显示任务的完成进度。 为了美化Delphi进度条,可以使用各种方法和技巧。 一种常见的美化方法是改变进度条的外观。可以自定义进度条的颜色和样式,以使其与应用程序的整体外观和风格保持一致。Delphi提供了属性和事件来实现这一目的。通过修改进度条的背景色、前景色和边框样式,可以根据需求设计独特的进度条外观。 另外,还可以在进度条中添加文本或图标,以显示更具体的信息。通过在进度条上绘制文本或添加图标,可以使用户更直观地了解任务的进度,增强用户体验。 另一个美化进度条的方法是添加动画效果。通过使用动画库,如GIF动画或逐帧动画,可以为进度条添加各种动态效果,如闪烁、渐变等。这些动画效果可以吸引用户的注意力,让用户更加关注任务的进度。 此外,还可以通过添加过渡效果来美化进度条。过渡效果可以使进度条的显示更加平滑和流畅,给用户一种更自然的感觉。例如,在进度条更新时添加渐变效果,可以使进度条的变化更加平滑,增强用户的视觉体验。 总之,通过合理利用Delphi提供的功能和技巧,我们可以美化进度条,使其更符合应用程序的整体风格和用户体验的需求。无论是改变进度条的外观、添加文本和图标、添加动画效果或过渡效果,都可以为Delphi应用程序带来更好的用户体验。 ### 回答3: Delphi是一种用于开发Windows桌面应用程序的集成开发环境(IDE)。在Delphi中,我们可以使用TProgressBar组件来创建和管理进度条。然而,基本的进度条可能显得有些单调和无趣。因此,我们可以通过美化进度条来增强用户体验。 一种常见的美化方法是修改进度条的外观。我们可以使用Delphi中提供的颜色、样式和字体等属性,将进度条改为更符合应用程序主题和风格的外观。例如,我们可以改变进度条的背景色和前景色,使其更加醒目和吸引人。另外,我们还可以选择合适的字体,并使用字体颜色属性来提高进度条的可读性。 此外,我们还可以添加动画效果来使进度条更加生动。通过在进度条上添加一些动态效果,比如渐变效果、闪烁效果或者流动效果,可以更好地吸引用户的注意力。这些动画效果可以通过修改进度条的显示方式、使用计时器来控制进度条的刷新率,并结合一些过渡效果来实现。 另一个可行的方法是使用图像来替代标准的进度条外观。我们可以将自定义的图像作为进度条的背景或前景,并使用图片或图标代替标准的进度条提示。这样一来,用户会感到更亲切和有趣,同时也能更好地体现应用程序的风格和主题。 总之,通过修改属性、添加动画效果或使用图像,我们可以美化Delphi中的进度条,提高应用程序的用户体验和视觉吸引力。这些方法都需要根据具体的应用程序需求和设计目标来选择,并与其他界面元素相协调,以确保整体一致性和流畅性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值