Installation 动态添加自定义页面(在运行时)

Installation 动态添加自定义页面(在运行时),installation,nsis,Installation,Nsis,我正在使用NSIS安装程序脚本语言编写安装脚本。我有一些自定义页面,可以轻松加载,但我想知道是否可以动态插入页面。我想做的是有一个页面,上面有额外的配置选项,底部有一个复选框,上面写着“添加更多设置”或类似的内容。如果勾选该复选框,它将显示另一个与第一个完全相同的自定义页面。只要用户一直选中复选框,就会显示更多页面。有什么方法可以一次又一次地重复使用同一页吗?我真的不认为我需要生成一个完整的新页面,因为它只是一次又一次的同一页面,但我不确定如何在运行时显示同一页面的新实例。谷歌和stackove

我正在使用NSIS安装程序脚本语言编写安装脚本。我有一些自定义页面,可以轻松加载,但我想知道是否可以动态插入页面。我想做的是有一个页面,上面有额外的配置选项,底部有一个复选框,上面写着“添加更多设置”或类似的内容。如果勾选该复选框,它将显示另一个与第一个完全相同的自定义页面。只要用户一直选中复选框,就会显示更多页面。有什么方法可以一次又一次地重复使用同一页吗?我真的不认为我需要生成一个完整的新页面,因为它只是一次又一次的同一页面,但我不确定如何在运行时显示同一页面的新实例。谷歌和stackoverflow的快速搜索并不保证有任何结果


谢谢大家。

在编译时,页数是固定的

如果您需要不同的“隐藏”页面或同一页面的两个实例,我建议您在页面的创建回调中调用abort,在需要时跳过页面,但如果页面计数不受限制,这将不起作用

也可以直接转到以下页面:

Outfile test.exe
Requestexecutionlevel user

!include nsDialogs.nsh

Page Custom mypagecreate mypageleave
Page Directory dirpagecreate
Page Instfiles

Function mypagecreate
Var /Global MyCheckBox
nsDialogs::Create /NOUNLOAD 1018
Pop $0
${NSD_CreateCheckBox} 10% 20u 80% 12u "Again?"
Pop $MyCheckBox
nsDialogs::Show
FunctionEnd

Function mypageleave
${NSD_GetState} $MyCheckBox $0
StrCpy $MyCheckBox $0 ; This is a bit of a hack, we reuse the HWND var to store the state
FunctionEnd

Function dirpagecreate
${If} $MyCheckBox <> 0 ; Was the checkbox checked?
    SendMessage $HWNDPARENT 0x408 -1 "" ; If so, go back
${EndIf}
FunctionEnd

Section
SectionEnd
Outfile test.exe
Requestexecutionlevel用户
!包括nsDialogs.nsh
页面自定义mypagecreate mypageleave
页面目录dirpagecreate
页面文件
函数mypagecreate
Var/Global MyCheckBox
nsDialogs::创建/加载1018
流行音乐$0
${NSD_CreateCheckBox}10%20u 80%12u“又来了?”
弹出$MyCheckBox
nsDialogs::Show
功能端
功能mypageleave
${NSD_GetState}$MyCheckBox$0
StrCpy$MyCheckBox$0;这有点像黑客,我们重用HWND变量来存储状态
功能端
函数dirpagecreate
${If}$MyCheckBox 0;复选框是否已选中?
SendMessage$HWNDPARENT 0x408-1“”;如果是的话,回去吧
${EndIf}
功能端
部分
分段结束

我觉得这个很不错。我没有考虑存储窗口句柄以便以后重用。我会对它进行测试和编辑,让你知道它是否像预期的那样工作,但从这一点上看,它对我来说很好。这对我来说非常有效。我能让一切按我的意愿运转。非常感谢。“简洁是可以接受的,但更全面的解释更好。”。堆栈溢出值完整和完整答案。您可以编辑答案或单击答案左下角的“编辑”按钮。谢谢
page custom page1 option
page instfiles

Function page1
initpluginsdir
file /oname=$PLUGINSDIR\dlg.ini dlg.ini
installoptions::dialog "$PLUGINSDIR\dlg.ini"
FunctionEnd

Function Options
ReadINIStr $0 "$PLUGINSDIR\dlg.ini" "Field 1" "State" # Field Must have value 0 or 1. Maybe Text or Chechbox
StrCmp $0 0 0 +2
abort
FunctionEnd