在Delphi中使用自绘属性设计进度条

技术与开发

读者:窗体下方的状态栏可以分割为很多面板,在面板上显示静态的文本文字很容易实现,但如果要显示动态的,比如Word在保存文档的过程中,窗体下方的状态栏会显示一个进度条,动态显示保存的过程,请问是如何实现的呢?

小编:当然可以在状态栏中显示进度条,只要使用状态栏的自绘技术就可以把进度条“嵌入”到状态栏了。

Delphi的状态栏面板的自绘属性是状态栏的特色之一,使用状态栏面板的自绘属性可以在状态栏中嵌入一些组件来动态显示程序处理的进度和过程,比如ProgressBar、Gauge都能嵌入到状态栏中,使用状态栏面板的自绘属性方法为:

第一步设置状态条面板的Style为PsOwnerDraw,状态栏就可以被放置其他组件了,第二步将“嵌入”组件的父级设置为状态栏组件,第三步在状态栏的OnDrawPanel事件中获取状态栏面板的坐标及大小后设置“嵌入”组件的Left、Top、Width,Height,第四步对添加的组件做动画效果。

下面介绍如何用Delphi在状态栏中显示进度条(如图1)。

51-技2.jpg
图1

进度条设计步骤

第一步:打开Delphi,新建一个项目,在窗体上放置一个状态条StatusBar1组件、Button1组件和一个进度条ProgressBar1组件。ProgressBar和StatusBar都位于delphi的win32组件面板上。双击StatusBar1,在弹出的对话框中点击[Add New(Ins)]按钮,再次点击一次这个按钮,把状态栏分割为2个面板。

第二步:在窗体创建时将状态栏的第二块面板设为自绘(即psOwnerDraw),在窗体的FormCreate事件中加入:

procedure TForm1.FormCreate(Sender: TObject);

var

ProgressBarStyle: integer;

begin

//设置状态栏的第一块面板显示文字“演示”

StatusBar1.Panels[0].Text :='演示';

//将状态栏的第二块面板设为的自绘(即psOwnerDraw)这是解决问题的关键,当Style被设为psOwnerDraw之后,面板上就可以被放置其它组件了

StatusBar1.Panels[1].Style := psOwnerDraw;

//将进程条放入状态栏,将其父级设置为StatusBar1组件

ProgressBar1.Parent := StatusBar1;

//去除状态栏的边框,这样就与状态栏融为一体了

ProgressBarStyle := GetWindowLong(ProgressBar1.Handle,GWL_EXSTYLE);

ProgressBarStyle := ProgressBarStyle - WS_EX_STATICEDGE;

SetWindowLong(ProgressBar1.Handle, GWL_EXSTYLE, ProgressBarStyle);

end;

第三步:设置进度条的位置和尺寸,需要在状态栏的OnDrawPanel事件中编写如下代码:

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;

Panel: TStatusPanel; const Rect: TRect);

begin

//注意这里的Panels[1]指的就是第2块面板,第一块面板是Panels[0]

if Panel = StatusBar.Panels[1] then

with ProgressBar1 do

begin

Top := Rect.Top;//Top和Left确定进度条的坐标

Left := Rect.Left;

Width := Rect.Right - Rect.Left-10; // Width和Height设置进度条的宽度和高度

Height := Rect.Bottom - Rect.Top;

end;

end;

第四步:在Button1的点击事件中执行一个模拟计算过程的循环操作,同时让进度条动起来。

procedure TForm1.Button1Click(Sender: TObject);

var

i : integer;

begin

//进度条动画的关键取决于ProgressBar1.Max的值和sleep的值

ProgressBar1.Max := 100;

for i := 0 to ProgressBar1.Max do

begin

ProgressBar1.Position := i;

Sleep(50);

end;

end;

经过上述处理后,运行程序,点击Button按钮,进度条就动起来了(如图2)。

51-技1.jpg
图2

总结

状态栏的自绘功能不但能够“嵌入”进度条,也可以嵌入其他组件,充分发挥状态栏的自绘功能,根据需要灵活“嵌入”组件,这些“嵌入”的组件可以做动画,也可以做消息提示,这样能大大提高我们软件的友好度。