NSIS 可选自定义页面
NSIS optional custom pages
我想在安装过程结束时在 NSIS 中创建一个复选框,当被选中时,它将引导用户进入一个自定义页面,该页面有一堆单选框,引导用户进入另一个自定义页面(取决于选择)等等。
我知道如何使用 nsDialogs 创建自定义页面,但我无法弄清楚多个可选自定义页面背后的逻辑。感谢您的帮助。
或者,有没有一种方法可以创建多个 checkbox/radiobox 组,这些组默认禁用(第一个除外)并且仅当用户在其之前的组中选择一个框时才激活?
在页面预回调中调用Abort
跳过页面。然后您所要做的就是跟踪要显示的页面和要跳过的页面:
!include nsDialogs.nsh
!include LogicLib.nsh
Section "Do custom page thing" SID_DOCUSTOMPAGES
SectionEnd
Page Components
Page InstFiles
Page Custom Cust1Pre Cust2Next
Page Custom CustAPre
Page Custom CustBPre
Var WantedPage
Function Cust1Pre
${IfNot} ${SectionIsSelected} ${SID_DOCUSTOMPAGES}
StrCpy $WantedPage ""
Abort
${EndIf}
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateRadioButton} 0 30u 100% 10u "Page A"
Pop
${NSD_Check}
${NSD_CreateRadioButton} 0 40u 100% 10u "Page B"
Pop
nsDialogs::Show
FunctionEnd
Function Cust2Next
${NSD_GetState} [=10=]
${If} [=10=] <> ${BST_UNCHECKED}
StrCpy $WantedPage A
${Else}
StrCpy $WantedPage B
${EndIf}
FunctionEnd
Function CustAPre
${IfNotThen} $WantedPage == A ${|} Abort ${|}
GetDlgItem [=10=] $hWndParent 1
SendMessage [=10=] ${WM_SETTEXT} "" "STR:$(^CloseBtn)" ; Change button text since page B is skipped and we are now the last page
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateButton} 0 30u 100% 10u "Page A"
Pop [=10=]
nsDialogs::Show
FunctionEnd
Function CustBPre
${IfNotThen} $WantedPage == B ${|} Abort ${|}
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateButton} 0 30u 100% 10u "Page B"
Pop [=10=]
nsDialogs::Show
FunctionEnd
您可以通过将单个页面设为“A”或“B”来摆脱 WM_SETTEXT 解决方法:
!include nsDialogs.nsh
!include LogicLib.nsh
Section "Do custom page thing" SID_DOCUSTOMPAGES
SectionEnd
Page Components
Page InstFiles
Page Custom Cust1Pre Cust2Next
Page Custom CustAOrBPre
Var WantedPage
Function Cust1Pre
${IfNot} ${SectionIsSelected} ${SID_DOCUSTOMPAGES}
StrCpy $WantedPage ""
Abort
${EndIf}
nsDialogs::Create 1018
Pop [=11=]
${NSD_CreateRadioButton} 0 30u 100% 10u "Page A"
Pop
${NSD_Check}
${NSD_CreateRadioButton} 0 40u 100% 10u "Page B"
Pop
nsDialogs::Show
FunctionEnd
Function Cust2Next
${NSD_GetState} [=11=]
${If} [=11=] <> ${BST_UNCHECKED}
StrCpy $WantedPage A
${Else}
StrCpy $WantedPage B
${EndIf}
FunctionEnd
Function CustAPre
nsDialogs::Create 1018
Pop [=11=]
${NSD_CreateButton} 0 30u 100% 10u "Page A"
Pop [=11=]
nsDialogs::Show
FunctionEnd
Function CustBPre
nsDialogs::Create 1018
Pop [=11=]
${NSD_CreateButton} 0 30u 100% 10u "Page B"
Pop [=11=]
nsDialogs::Show
FunctionEnd
Function CustAOrBPre
${If} $WantedPage == A
Call CustAPre
${Else}
Call CustBPre
${EndIf}
FunctionEnd
只有一个禁用选项的页面当然更好:
!include nsDialogs.nsh
!include LogicLib.nsh
Page InstFiles
Page Custom CustPre
Function CustPre
nsDialogs::Create 1018
Pop [=12=]
${NSD_CreateCheckBox} 10 30u 100% 10u "Enable other stuff"
Pop [=12=]
${NSD_OnClick} [=12=] OnCheckChange
${NSD_CreateRadioButton} 10 50u 100% 10u "Foo"
Pop
${NSD_AddStyle} ${WS_GROUP}
${NSD_Check}
${NSD_CreateRadioButton} 10 70u 100% 10u "Bar"
Pop
${NSD_RemoveStyle} ${WS_TABSTOP}
Push [=12=]
Call OnCheckChange ; Enforce state
nsDialogs::Show
FunctionEnd
!macro SetRadiosEnabled state
EnableWindow ${state}
EnableWindow ${state}
!macroend
Function OnCheckChange
Pop [=12=]
${NSD_GetState} [=12=] [=12=]
${If} [=12=] <> ${BST_UNCHECKED}
!insertmacro SetRadiosEnabled 1
${Else}
!insertmacro SetRadiosEnabled 0
${EndIf}
FunctionEnd
我想在安装过程结束时在 NSIS 中创建一个复选框,当被选中时,它将引导用户进入一个自定义页面,该页面有一堆单选框,引导用户进入另一个自定义页面(取决于选择)等等。
我知道如何使用 nsDialogs 创建自定义页面,但我无法弄清楚多个可选自定义页面背后的逻辑。感谢您的帮助。
或者,有没有一种方法可以创建多个 checkbox/radiobox 组,这些组默认禁用(第一个除外)并且仅当用户在其之前的组中选择一个框时才激活?
在页面预回调中调用Abort
跳过页面。然后您所要做的就是跟踪要显示的页面和要跳过的页面:
!include nsDialogs.nsh
!include LogicLib.nsh
Section "Do custom page thing" SID_DOCUSTOMPAGES
SectionEnd
Page Components
Page InstFiles
Page Custom Cust1Pre Cust2Next
Page Custom CustAPre
Page Custom CustBPre
Var WantedPage
Function Cust1Pre
${IfNot} ${SectionIsSelected} ${SID_DOCUSTOMPAGES}
StrCpy $WantedPage ""
Abort
${EndIf}
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateRadioButton} 0 30u 100% 10u "Page A"
Pop
${NSD_Check}
${NSD_CreateRadioButton} 0 40u 100% 10u "Page B"
Pop
nsDialogs::Show
FunctionEnd
Function Cust2Next
${NSD_GetState} [=10=]
${If} [=10=] <> ${BST_UNCHECKED}
StrCpy $WantedPage A
${Else}
StrCpy $WantedPage B
${EndIf}
FunctionEnd
Function CustAPre
${IfNotThen} $WantedPage == A ${|} Abort ${|}
GetDlgItem [=10=] $hWndParent 1
SendMessage [=10=] ${WM_SETTEXT} "" "STR:$(^CloseBtn)" ; Change button text since page B is skipped and we are now the last page
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateButton} 0 30u 100% 10u "Page A"
Pop [=10=]
nsDialogs::Show
FunctionEnd
Function CustBPre
${IfNotThen} $WantedPage == B ${|} Abort ${|}
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateButton} 0 30u 100% 10u "Page B"
Pop [=10=]
nsDialogs::Show
FunctionEnd
您可以通过将单个页面设为“A”或“B”来摆脱 WM_SETTEXT 解决方法:
!include nsDialogs.nsh
!include LogicLib.nsh
Section "Do custom page thing" SID_DOCUSTOMPAGES
SectionEnd
Page Components
Page InstFiles
Page Custom Cust1Pre Cust2Next
Page Custom CustAOrBPre
Var WantedPage
Function Cust1Pre
${IfNot} ${SectionIsSelected} ${SID_DOCUSTOMPAGES}
StrCpy $WantedPage ""
Abort
${EndIf}
nsDialogs::Create 1018
Pop [=11=]
${NSD_CreateRadioButton} 0 30u 100% 10u "Page A"
Pop
${NSD_Check}
${NSD_CreateRadioButton} 0 40u 100% 10u "Page B"
Pop
nsDialogs::Show
FunctionEnd
Function Cust2Next
${NSD_GetState} [=11=]
${If} [=11=] <> ${BST_UNCHECKED}
StrCpy $WantedPage A
${Else}
StrCpy $WantedPage B
${EndIf}
FunctionEnd
Function CustAPre
nsDialogs::Create 1018
Pop [=11=]
${NSD_CreateButton} 0 30u 100% 10u "Page A"
Pop [=11=]
nsDialogs::Show
FunctionEnd
Function CustBPre
nsDialogs::Create 1018
Pop [=11=]
${NSD_CreateButton} 0 30u 100% 10u "Page B"
Pop [=11=]
nsDialogs::Show
FunctionEnd
Function CustAOrBPre
${If} $WantedPage == A
Call CustAPre
${Else}
Call CustBPre
${EndIf}
FunctionEnd
只有一个禁用选项的页面当然更好:
!include nsDialogs.nsh
!include LogicLib.nsh
Page InstFiles
Page Custom CustPre
Function CustPre
nsDialogs::Create 1018
Pop [=12=]
${NSD_CreateCheckBox} 10 30u 100% 10u "Enable other stuff"
Pop [=12=]
${NSD_OnClick} [=12=] OnCheckChange
${NSD_CreateRadioButton} 10 50u 100% 10u "Foo"
Pop
${NSD_AddStyle} ${WS_GROUP}
${NSD_Check}
${NSD_CreateRadioButton} 10 70u 100% 10u "Bar"
Pop
${NSD_RemoveStyle} ${WS_TABSTOP}
Push [=12=]
Call OnCheckChange ; Enforce state
nsDialogs::Show
FunctionEnd
!macro SetRadiosEnabled state
EnableWindow ${state}
EnableWindow ${state}
!macroend
Function OnCheckChange
Pop [=12=]
${NSD_GetState} [=12=] [=12=]
${If} [=12=] <> ${BST_UNCHECKED}
!insertmacro SetRadiosEnabled 1
${Else}
!insertmacro SetRadiosEnabled 0
${EndIf}
FunctionEnd