问题描述
UserPage2 := CreateCustomPage(
UserPage1.ID,'Title','Details'
);
需要看起来像这样,
这是因为,有时当用户再次运行安装程序时,他们只能选择几个选项。根据选项,安装程序需要对已安装程序使用的设置进行少量更改,而无需通过重新安装来覆盖文件。所以用户应该在更改后获得完成对话框。
解决方法
-
在您的自定义页面上重新创建
FinishedPage
控件。 -
进入页面时,需要调整
WizardForm.InnerNotebook
的大小以覆盖整个向导窗口(底部按钮区域除外)并隐藏页眉控件。
var
FakeFinishedPage: TWizardPage;
FakeFinishedBitmapImage: TBitmapImage;
FakeFinishedLabel: TNewStaticText;
FakeFinishedHeadingLabel: TNewStaticText;
procedure CopyBounds(Dest,Source: TControl);
begin
Dest.Left := Source.Left;
Dest.Top := Source.Top;
Dest.Width := Source.Width;
Dest.Height := Source.Height;
end;
procedure FakeFinishedPageActivate(Sender: TWizardPage);
begin
WizardForm.Bevel1.Visible := False;
WizardForm.MainPanel.Visible := False;
WizardForm.InnerNotebook.Left := 0;
WizardForm.InnerNotebook.Top := 0;
WizardForm.InnerNotebook.Width := WizardForm.OuterNotebook.ClientWidth;
WizardForm.InnerNotebook.Height := WizardForm.OuterNotebook.ClientHeight;
// With WizardStyle=modern and/or WizardResizable=yes,// we cannot copy the sizes in InitializeWizard as they are not final yet.
CopyBounds(FakeFinishedBitmapImage,WizardForm.WizardBitmapImage2);
FakeFinishedBitmapImage.Anchors := WizardForm.WizardBitmapImage2.Anchors;
CopyBounds(FakeFinishedLabel,WizardForm.FinishedLabel);
FakeFinishedLabel.Anchors := WizardForm.FinishedLabel.Anchors;
CopyBounds(FakeFinishedHeadingLabel,WizardForm.FinishedHeadingLabel);
FakeFinishedHeadingLabel.Anchors := WizardForm.FinishedHeadingLabel.Anchors;
WizardForm.BackButton.Visible := False;
WizardForm.NextButton.Caption := SetupMessage(msgButtonFinish);
end;
procedure CopyLabel(Dest,Source: TNewStaticText);
begin
Dest.AutoSize := Source.AutoSize;
Dest.Font := Source.Font;
Dest.ShowAccelChar := Source.ShowAccelChar;
Dest.WordWrap := Source.WordWrap;
end;
procedure InitializeWizard();
var
S: string;
begin
// ...
FakeFinishedPage := CreateCustomPage(UserPage1.ID,'','');
FakeFinishedPage.OnActivate := @FakeFinishedPageActivate;
FakeFinishedBitmapImage := TBitmapImage.Create(WizardForm);
FakeFinishedBitmapImage.Parent := FakeFinishedPage.Surface;
FakeFinishedBitmapImage.BackColor := WizardForm.WizardBitmapImage2.BackColor;
FakeFinishedBitmapImage.Bitmap := WizardForm.WizardBitmapImage2.Bitmap;
FakeFinishedBitmapImage.Stretch := WizardForm.WizardBitmapImage2.Stretch;
FakeFinishedLabel := TNewStaticText.Create(WizardForm);
FakeFinishedLabel.Parent := FakeFinishedPage.Surface;
CopyLabel(FakeFinishedLabel,WizardForm.FinishedLabel);
S := SetupMessage(msgFinishedLabelNoIcons) + #13#13 + SetupMessage(msgClickFinish);
StringChangeEx(S,'[name]','My Program',True);
FakeFinishedLabel.Caption := S;
FakeFinishedHeadingLabel := TNewStaticText.Create(WizardForm);
FakeFinishedHeadingLabel.Parent := FakeFinishedPage.Surface;
CopyLabel(FakeFinishedHeadingLabel,WizardForm.FinishedHeadingLabel);
S := SetupMessage(msgFinishedHeadingLabel);
StringChangeEx(S,True);
FakeFinishedHeadingLabel.Caption := S;
end;
有一些限制:
- 当向导调整大小(使用
WizardResizable=yes
)时,代码无法正确处理图像大小调整 - 不过很容易修复。 - 该解决方案不希望在显示此虚假完成页面后会显示任何页面。 IE。没有 Back 按钮,预计 Finish 按钮是用来杀死安装程序的。毕竟,这是对Conditionally skip to a custom page at the end of the Inno Setup installation wizard without installing? 的后续问题
虽然要避免所有这些黑客行为,但请考虑允许安装正常进行,但不要更改任何内容。最终可能更容易实施。
相关问题:
- Image covering whole page in Inno Setup – 通过在向导窗口的整个上部覆盖控件来解决问题的替代实现,根据需要隐藏/显示它。
- Custom Welcome and Finished page with stretched image in Inno Setup
- How to hide the main panel and show an image over the whole page?