【问题标题】:Skipping pages: Button should say "Install" instead of "Next"跳过页面:按钮应显示“安装”而不是“下一步”
【发布时间】:2015-02-19 01:16:51
【问题描述】:

我有一个使用 Modern UI 2 (MUI 2) 的安装程序,可以将最多三个组件安装到不同的位置

我使用一个MUI_PAGE_COMPONENTS 页面和多个MUI_PAGE_DIRECTORY 页面,如果未选择相应的部分(如here 所述),则会自动跳过这些页面。

到目前为止一切顺利。

但是,如果没有选择安装三个组件中的最后一个,则上一个(未跳过的)目录页面上的按钮应该是 Install 而不是 Next,因为接下来会跳过最后一个目录页并执行安装。

既然我们已经知道离开组件页面后会跳过哪个页面,不知道有没有办法让它工作?

小例子:

!include MUI2.nsh

InstallDir $EXEDIR
OutFile "skip.exe"
RequestExecutionLevel user
ShowInstDetails show

!insertmacro MUI_PAGE_COMPONENTS

!define MUI_PAGE_CUSTOMFUNCTION_PRE directoryPreA
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_PAGE_CUSTOMFUNCTION_PRE directoryPreB
!insertmacro MUI_PAGE_DIRECTORY 

!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"

Section "A" SEC_A
  DetailPrint "Installing A..."
SectionEnd

Section /o "B" SEC_B
  DetailPrint "Installing B..."
SectionEnd

Function directoryPreA
  # Skips the directory page for A if not chosen for installation.
  ${Unless} ${SectionIsSelected} ${SEC_A}
    Abort
  ${EndUnless}
FunctionEnd

Function directoryPreB
  # Skips the directory page for B if not chosen for installation.
  ${Unless} ${SectionIsSelected} ${SEC_B}
    Abort
  ${EndUnless}
FunctionEnd

【问题讨论】:

标签: nsis


【解决方案1】:
!include MUI2.nsh
!insertmacro MUI_PAGE_COMPONENTS

!define MUI_DIRECTORYPAGE_TEXT_TOP "Dir:A"
!define MUI_PAGE_CUSTOMFUNCTION_PRE directoryPreA
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_DIRECTORYPAGE_TEXT_TOP "Dir:B"
!define MUI_PAGE_CUSTOMFUNCTION_PRE directoryPreB
!insertmacro MUI_PAGE_DIRECTORY 

!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"

Section "A" SEC_A
  DetailPrint "Installing A..."
SectionEnd

Section /o "B" SEC_B
  DetailPrint "Installing B..."
SectionEnd

Function .onSelChange
  GetDlgItem $0 $HWNDPARENT 1
  ${If} ${SectionIsSelected} ${SEC_A}
  ${OrIf} ${SectionIsSelected} ${SEC_B}
    SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^NextBtn)"
  ${Else}
    SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^InstallBtn)"
  ${EndIf}
FunctionEnd

Function directoryPreA
  # Skips the directory page for A if not chosen for installation.
  ${IfNot} ${SectionIsSelected} ${SEC_A}
    Abort
  ${ElseIfNot} ${SectionIsSelected} ${SEC_B}
    GetDlgItem $0 $HWNDPARENT 1
    SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^InstallBtn)"
  ${EndIf}
FunctionEnd

Function directoryPreB
  # Skips the directory page for B if not chosen for installation.
  ${Unless} ${SectionIsSelected} ${SEC_B}
    Abort
  ${EndUnless}
FunctionEnd

【讨论】:

  • 我不知道你可以 SendMessageCUSTOMFUNCTION_PRE 处理程序中的对话框元素。我正要实现一个CUSTOMFUNCTION_SHOW 处理程序来尝试执行您在此处显示的操作。很高兴知道。
  • @bassim 您不能在 PRE 中执行所有操作,但 Next 按钮位于外部对话框中,并且无论您在哪个页面回调中都将存在。内部对话框中的控件大部分应该是在显示回调中处理。
猜你喜欢
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 2023-03-26
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多