Windows7正式版已经用了很久了,MSDN上面正式版Windows7已经发布很久了。
发现Windows7的TaskBar很漂亮,也有很多功能。例如IE下载的时候可以看到进度,可以叠加图标等等特效。
Delphi2010也发布很久了,Delphi2010号称支持Windows7的新增API,那么看看有没有TaskBar相关的API。
一提到Taskbar相关,首先就想到ITaskBarList不同版本接口。到shlobj单元一看,果然增加了ITaskbarList3、ITaskbarList4两个新版本的接口。
老办法CreateComObject(CLSID_TaskbarList)就行了。返回的是一个ITaskBarList接口。看具体的操作系统,返回的是你操作系统所能支持的最高版本的ITaskBarList。
先来看进度条:
设计一个窗口
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShlObj, ActiveX, ComObj, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
GroupBox1: TGroupBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox1: TCheckBox;
CheckBox4: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
private
{ Private declarations }
FPos : Int64;
FMax : Int64;
FTaskBarList : ITaskbarList4;
function SetProgressState():Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
Timer1.Enabled := not CheckBox1.Checked;
// 不定的时候设了State就不能再设Value,否则会冲掉。
SetProgressState();
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FTaskBarList := CreateComObject(CLSID_TaskbarList) as ITaskbarList4;
FPos := 0;
FMax := 200;
SetProgressState();
end;
function TForm1.SetProgressState: Integer;
begin
Result := TBPF_NOPROGRESS;
if CheckBox1.Checked then
Result := Result or TBPF_INDETERMINATE;
if CheckBox2.Checked then
Result := Result or TBPF_NORMAL;
if CheckBox3.Checked then
Result := Result or TBPF_ERROR;
if CheckBox4.Checked then
Result := Result or TBPF_PAUSED;
FTaskBarList.SetProgressState(Handle, Result);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (FPos < FMAX) then
Inc(FPos, 10)
else
FPos := 0;
FTaskBarList.SetProgressValue(Handle, FPos, FMax);
end;
end.