如何实现类似Acdsee的进度条(100分)

  • 主题发起人 主题发起人 陈冲伟
  • 开始时间 开始时间

陈冲伟

Unregistered / Unconfirmed
GUEST, unregistred user!
Acdsee在载入图像时在状态条的地方会出现一个奇怪的进度条,不知道是怎么实现的?
 
你的意思是指如何在状态栏加载进度条吧:

这里有一篇文章供参考:

在Office 2000、Internet Explorer以及Netscape 等软件中,
我们可以看到非常漂亮的窗口状态条。特别是Netscape Communicator,
在它的窗口状态条中不仅显示有文字,而且还有图形、动画、浮动按钮以及进度条。
对于Delphi编程人员来说,为一个窗口创建状态条是非常容易的事情,Delphi所提
供的TStatusBar可视化控件可以让我们快速地实现状态条。然而令人遗憾的是用
TStatusBar创建的状态条仅能显示文字。本文向大家介绍如何在Delphi程序中创建
更为漂亮的StatusBar。

---- 要创建类似Netscape风格的状态条,现有的Delphi控件是无能为力的了。
为了让窗口状态条能包含非文本内容,我们需要对现有的TStatusBar控件加以改进。
在TStatusBar控件的基础上,我们编写一个新的Delphi控件TStatusBarEx。大家知道,
Delphi的TStatusBar控件是不能接受其它控件的,所以我们不可能将一个TImage、
TButton等放在TStatusBar上。但是我们接下来要创建的TStatusBarEx控件将可以包容
其它的控件。通过TStatusBarEx控件,我们可以使Delphi创建的状态条跟Netscape的
状态条一样漂亮,让其可以包含图形、动画、进度条等等。

---- 在Delphi中,一个控件上能否成为其它控件的父控件取决于此控件的ControlStyle
属性。ControlStyle属性是集合类型的,如果此集合包含csAcceptsControls元素,则它
能接受其它控件;否则,它就不能成为其它控件的父控件。ControlStyle属性只能在控件
的构造函数(Constructor)中指定,在程序运行时它是不能被改变的。所以如果希望窗口
状态条上面能包含其它控件,我们只需要在继承类中重载TStatusBar控件的Constructor函
数,并且让控件的集合属性ControlStyle中包含csAcceptsControls即可。 TStatusBarEx控
件的实现

---- 以下是实现TStatusBarEx控件的Delphi源代码,请把这段代码拷贝下来,并且将其保存
到文件StatusBarEx.PAS中去。然后用Delphi打开StatusBarEx.PAS文件,之后选择“Component
| Install Component …”,将TStatusBarEx控件安装。

//文件名:StatusBarEx.pas
unit StatusBarEx;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, ComCtrls, DsgnIntf;

type

//定义About属性的属性编辑器
TAbout = class(TPropertyEditor)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
end;

//定义TStatusBarEx控件
TStatusBarEx = class(TStatusBar)
private
{ Private declarations }
FAbout:TAbout;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
property About: TAbout read FAbout;
end;

procedure Register;

implementation

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

{为了让TStatusBarEx控件能接受其它控件,必须
使ControlStyle属性(集合类型)包含csAcceptsControls元素}
ControlStyle:= ControlStyle + [csAcceptsControls];
end;

//以下是TAbout中的成员函数的实现
procedure TAbout.Edit;
begin
Application.MessageBox('TStatusBarEx for Delphi 5'#13#10
+'Written by Simon Liu'#13#10
+'Email:simon_liu@263.net',
'About TStatusBarEx',MB_ICONINFORMATION);
end;

function TAbout.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;

function TAbout.GetValue: string;
begin
Result := '(Simon)';
end;

procedure Register;
begin
//将TStatusBarEx控件注册到Delphi 5控件板的Win32页上
RegisterComponents('Win32', [TStatusBarEx]);

//为About属性注册属性编辑器
RegisterPropertyEditor(typeInfo(TAbout), TStatusBar,
'About', TAbout);
end;

end.

---- 使用TStatusBarEx控件,我们可以非常容易地在StatusBar上增添其它的内容了。比如,如果想要在状态条上显示一个图片,只要在TStatusBarEx控件上放一个Image控件;
想要添加一个进度条,只需在上面加一个ProgressBar就行了。
 
statusbar有个ondrawpanel事件,可以在这个事件中画出很好看的进度条。(将panel的style
属性设置为psownerdraw)。
 
动态生成进度条,然后设置进度条的parent属性为Tstatusbar就行了
 
请问hhzh426兄:
用ownerdraw具体如何实现进度条功能呢?
 
比如将statusbar的第一个panel的style属性设置为psownerdraw,在进度改变时将进度值
(百分数,比如20%就用20代替)赋给panels[0].text,然后在statusbar的ondrawpanel事件
中:
var
myrect:trect;
begin
myrect:=rect;
myrect.right:=myrect.left+(rect.right-rect.left)*strtoint(panel.text)/100;
statusbar.canvas.brush.color:=clblue;
statusbar.canvas.fillrect(myrect);
end;
 
hhzh426兄:
我用你写的方法试了一下, 效果很不错, 不过有一个问题想请教: 显示
进度条递进的过程中有闪烁现象, 如何才能解决呢?
 
在FormCreate加入一句:
StatusBar1.DoubleBuffered := True;
就可以防止闪烁
 
多人接受答案了。
 
后退
顶部