Inno Setup - 安装进度条未达到 100%
Inno Setup - Installation progress bar does not reach 100%
我使用此代码显示经过的时间、时间百分比和预计时间进度:
[Code]
function GetTickCount: DWORD;
external 'GetTickCount@kernel32.dll stdcall';
var
StartTick: DWORD;
PercentLabel: TNewStaticText;
ElapsedLabel: TNewStaticText;
RemainingLabel: TNewStaticText;
function TicksToStr(Value: DWORD): string;
var
I: DWORD;
Hours, Minutes, Seconds: Integer;
begin
I := Value div 1000;
Seconds := I mod 60;
I := I div 60;
Minutes := I mod 60;
I := I div 60;
Hours := I mod 24;
Result := Format('%.2d:%.2d:%.2d', [Hours, Minutes, Seconds]);
end;
procedure InitializeWizard;
begin
PercentLabel := TNewStaticText.Create(WizardForm);
PercentLabel.Parent := WizardForm.ProgressGauge.Parent;
PercentLabel.Left := 0;
PercentLabel.Top := WizardForm.ProgressGauge.Top +
WizardForm.ProgressGauge.Height + 12;
ElapsedLabel := TNewStaticText.Create(WizardForm);
ElapsedLabel.Parent := WizardForm.ProgressGauge.Parent;
ElapsedLabel.Left := 0;
ElapsedLabel.Top := PercentLabel.Top + PercentLabel.Height + 4;
RemainingLabel := TNewStaticText.Create(WizardForm);
RemainingLabel.Parent := WizardForm.ProgressGauge.Parent;
RemainingLabel.Left := 0;
RemainingLabel.Top := ElapsedLabel.Top + ElapsedLabel.Height + 4;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then
StartTick := GetTickCount;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
begin
Cancel := False;
if ExitSetupMsgBox then
begin
Cancel := True;
Confirm := False;
PercentLabel.Visible := False;
ElapsedLabel.Visible := False;
RemainingLabel.Visible := False;
end;
end;
end;
procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
var
CurTick: DWORD;
begin
CurTick := GetTickCount;
PercentLabel.Caption :=
Format('Done: %.2f %%', [(CurProgress * 100.0) / MaxProgress]);
ElapsedLabel.Caption :=
Format('Elapsed: %s', [TicksToStr(CurTick - StartTick)]);
if CurProgress > 0 then
begin
RemainingLabel.Caption :=
Format('Remaining: %s', [TicksToStr(
((CurTick - StartTick) / CurProgress) * (MaxProgress - CurProgress))]);
end;
end;
此代码与我的代码一起显示:
如何更新进度条以与进度条的末尾匹配 100%?
我需要添加更多信息吗? (抱歉我的英语不好)
没有太多,你可以做这个。
在 Windows 的现代版本中,使用 Aero 主题,进度条具有 "animation" 效果。当您更改进度条位置时,它不会直接跳到该位置,而是以动画方式跳转。要使动画正常工作,Window 消息队列必须被抽取。
在安装的最后步骤中(复制文件后),Inno Setup 会短暂停止并且不会抽取队列。因此,虽然进度条实际上设置为 100% 的位置并且 CurInstallProgressChanged
被调用时 CurProgress
等于 MaxProgress
,但视觉上进度条还没有处于 100%,因为动画等待中。而且动画实际上永远不会完成,因为在允许动画完成之前进度条是隐藏的。
如果您在 Windows 中禁用视觉主题,将进度条恢复为传统的无动画模式,您会发现问题消失了。
以下屏幕截图均来自 Windows 7.
的同一安装
Windows经典主题:
Windows 7 航空主题:
你所能做的就是使用此处显示的技巧:
Disabling .NET progressbar animation when changing value?
procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
begin
WizardForm.ProgressGauge.Position := WizardForm.ProgressGauge.Position - 1;
WizardForm.ProgressGauge.Update;
{ ... }
end;
虽然你会失去动画效果。
你显然还达不到 100%,但你可以非常接近它:
我使用此代码显示经过的时间、时间百分比和预计时间进度:
[Code]
function GetTickCount: DWORD;
external 'GetTickCount@kernel32.dll stdcall';
var
StartTick: DWORD;
PercentLabel: TNewStaticText;
ElapsedLabel: TNewStaticText;
RemainingLabel: TNewStaticText;
function TicksToStr(Value: DWORD): string;
var
I: DWORD;
Hours, Minutes, Seconds: Integer;
begin
I := Value div 1000;
Seconds := I mod 60;
I := I div 60;
Minutes := I mod 60;
I := I div 60;
Hours := I mod 24;
Result := Format('%.2d:%.2d:%.2d', [Hours, Minutes, Seconds]);
end;
procedure InitializeWizard;
begin
PercentLabel := TNewStaticText.Create(WizardForm);
PercentLabel.Parent := WizardForm.ProgressGauge.Parent;
PercentLabel.Left := 0;
PercentLabel.Top := WizardForm.ProgressGauge.Top +
WizardForm.ProgressGauge.Height + 12;
ElapsedLabel := TNewStaticText.Create(WizardForm);
ElapsedLabel.Parent := WizardForm.ProgressGauge.Parent;
ElapsedLabel.Left := 0;
ElapsedLabel.Top := PercentLabel.Top + PercentLabel.Height + 4;
RemainingLabel := TNewStaticText.Create(WizardForm);
RemainingLabel.Parent := WizardForm.ProgressGauge.Parent;
RemainingLabel.Left := 0;
RemainingLabel.Top := ElapsedLabel.Top + ElapsedLabel.Height + 4;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then
StartTick := GetTickCount;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
begin
Cancel := False;
if ExitSetupMsgBox then
begin
Cancel := True;
Confirm := False;
PercentLabel.Visible := False;
ElapsedLabel.Visible := False;
RemainingLabel.Visible := False;
end;
end;
end;
procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
var
CurTick: DWORD;
begin
CurTick := GetTickCount;
PercentLabel.Caption :=
Format('Done: %.2f %%', [(CurProgress * 100.0) / MaxProgress]);
ElapsedLabel.Caption :=
Format('Elapsed: %s', [TicksToStr(CurTick - StartTick)]);
if CurProgress > 0 then
begin
RemainingLabel.Caption :=
Format('Remaining: %s', [TicksToStr(
((CurTick - StartTick) / CurProgress) * (MaxProgress - CurProgress))]);
end;
end;
此代码与我的代码一起显示:
如何更新进度条以与进度条的末尾匹配 100%?
我需要添加更多信息吗? (抱歉我的英语不好)
没有太多,你可以做这个。
在 Windows 的现代版本中,使用 Aero 主题,进度条具有 "animation" 效果。当您更改进度条位置时,它不会直接跳到该位置,而是以动画方式跳转。要使动画正常工作,Window 消息队列必须被抽取。
在安装的最后步骤中(复制文件后),Inno Setup 会短暂停止并且不会抽取队列。因此,虽然进度条实际上设置为 100% 的位置并且 CurInstallProgressChanged
被调用时 CurProgress
等于 MaxProgress
,但视觉上进度条还没有处于 100%,因为动画等待中。而且动画实际上永远不会完成,因为在允许动画完成之前进度条是隐藏的。
如果您在 Windows 中禁用视觉主题,将进度条恢复为传统的无动画模式,您会发现问题消失了。
以下屏幕截图均来自 Windows 7.
的同一安装Windows经典主题:
Windows 7 航空主题:
你所能做的就是使用此处显示的技巧:
Disabling .NET progressbar animation when changing value?
procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
begin
WizardForm.ProgressGauge.Position := WizardForm.ProgressGauge.Position - 1;
WizardForm.ProgressGauge.Update;
{ ... }
end;
虽然你会失去动画效果。
你显然还达不到 100%,但你可以非常接近它: