如何将OK按钮更改为这样的倒数计时器......
5,4,3,2,1,0 [MsgBox自动关闭]不显示0
继续设置程序。
按钮不应该是可点击和褪色的。像非活动窗口/按钮/框一样。
这一个:
不是这一个:
答案 0 :(得分:2)
没有具有此类功能的内置功能。在Inno Setup和WinAPI都没有。
您必须自己实施对话框并使用Live Example来实现倒计时。
[Files]
Source: InnoCallback.dll; Flags: dontcopy
[Code]
type
TTimerProc = procedure(H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord);
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord;
lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: LongWord): BOOL;
external 'KillTimer@user32.dll stdcall';
function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord;
external 'wrapcallback@files:innocallback.dll stdcall';
var
CountdownButton: TNewButton;
Countdown: Integer;
procedure UpdateCountDownButtonCaption;
begin
CountdownButton.Caption := Format('%d sec', [Countdown]);
end;
procedure CountdownProc(H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord);
begin
Dec(Countdown);
if Countdown = 0 then
begin
CountdownButton.Enabled := True;
TForm(CountdownButton.Parent).Close;
end
else
begin
UpdateCountDownButtonCaption;
end;
end;
procedure CountdownMessageBoxCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
{ Prevent the dialog from being close by the X button and Alt-F4 }
CanClose := CountdownButton.Enabled;
end;
procedure CountdownMessageBox(Message: string; Seconds: Integer);
var
Form: TSetupForm;
MessageLabel: TLabel;
CountdownCallback: LongWord;
Timer: LongWord;
begin
Form := CreateCustomForm;
try
Form.ClientWidth := ScaleX(256);
Form.ClientHeight := ScaleY(96);
Form.Caption := 'Information';
Form.Position := poMainFormCenter;
Form.OnCloseQuery := @CountdownMessageBoxCloseQuery;
MessageLabel := TLabel.Create(Form);
MessageLabel.Top := ScaleY(16);
MessageLabel.Left := ScaleX(16);
MessageLabel.AutoSize := True;
MessageLabel.Caption := Message;
MessageLabel.Parent := Form;
if CountdownButton <> nil then
RaiseException('Countdown in progress already');
Countdown := Seconds;
CountdownButton := TNewButton.Create(Form);
CountdownButton.Parent := Form;
CountdownButton.Width := ScaleX(88);
CountdownButton.Height := ScaleY(26);
CountdownButton.Left := Form.ClientWidth - CountdownButton.Width - ScaleX(18);
CountdownButton.Top := Form.ClientHeight - CountdownButton.Height - ScaleX(11);
UpdateCountDownButtonCaption;
CountdownButton.Name := 'CountdownButton';
CountdownButton.ModalResult := mrOk;
CountdownButton.Default := True;
CountdownButton.Enabled := False;
CountdownCallback := WrapTimerProc(@CountdownProc, 4);
Timer := SetTimer(0, 0, 1000, CountdownCallback);
try
Form.ShowModal();
finally
KillTimer(0, Timer);
end;
finally
Form.Free();
CountdownButton := nil;
end;
end;
使用它像:
CountdownMessageBox('Message here', 10);
相关问题: