You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用nsDialogs::Create 1018为NSIS安装程序创建多对话框

使用nsDialogs::Create 1018实现NSIS多对话框安装流程

你的代码核心问题是在页面离开函数中直接调用页面创建函数,这不符合NSIS的页面管理逻辑,会导致流程混乱。正确的做法是通过NSIS的页面跳转机制来控制安装流程的分支,而非手动触发页面创建。以下是修正后的实现方案:

修正后的完整代码

!include nsDialogs.nsh
!include LogicLib.nsh

; 定义页面模板ID为1018(标准安装对话框模板)
!define MYPAGE_FIRST 1018
!define MYPAGE_SECOND 1018
!define MYPAGE_THIRD 1018

; 定义文本常量
!define WelcomeTitleText "欢迎使用安装程序"
!define WelcomeText "请选择安装选项:"
!define InstallSAEText "安装SAE组件"
!define SkipInstallSAEText "跳过SAE组件安装"

; 声明全局变量存储选择结果
Var g_InstallSAEChoice

Page custom Page1Create Page1Leave PAGE_CUSTOM_FIRST
Page custom Page2Create Page2Leave PAGE_CUSTOM_SECOND
Page custom Page3Create Page3Leave PAGE_CUSTOM_THIRD

Function Page1Create  
  nsDialogs::Create ${MYPAGE_FIRST}  
  Pop $Dialog1
  ${If} $Dialog1 == error
      Abort
  ${EndIf}  

  ; 创建标题标签
  ${NSD_CreateLabel} 0 0 100% 12u "${WelcomeTitleText}"
  ; 设置标题字体为加粗
  SendMessage $HWNDPARENT ${WM_SETFONT} $FontHandle 0

  ; 创建说明文本
  ${NSD_CreateLabel} 0 13u 100% 42u "${WelcomeText}"

  ; 创建单选按钮组
  ${NSD_CreateRadioButton} 5% 100u 90% 12u "${InstallSAEText}"
  Pop $InstallSAE
  ${NSD_Check} $InstallSAE ; 默认选中
  StrCpy $g_InstallSAEChoice 1 ; 初始化选择结果

  ${NSD_CreateRadioButton} 5% 120u 90% 12u "${SkipInstallSAEText}"
  Pop $SkipInstallSAE

  ; 绑定单选按钮的点击事件,更新全局变量
  ${NSD_OnClick} $InstallSAE Page1_OnRadioClick
  ${NSD_OnClick} $SkipInstallSAE Page1_OnRadioClick

  nsDialogs::Show
FunctionEnd  

; 单选按钮点击事件处理
Function Page1_OnRadioClick
  ${NSD_GetState} $InstallSAE $1
  ${If} $1 == ${BST_CHECKED}
      StrCpy $g_InstallSAEChoice 1
  ${Else}
      StrCpy $g_InstallSAEChoice 0
  ${EndIf}
FunctionEnd

Function Page1Leave  
  ; 根据选择结果跳转到对应页面
  ${If} $g_InstallSAEChoice == 1
      ; 跳转到第二页(PAGE_CUSTOM_SECOND)
      SetCurPage $0 1
  ${Else}
      ; 跳转到第三页(PAGE_CUSTOM_THIRD)
      SetCurPage $0 2
  ${EndIf}
FunctionEnd 

Function Page2Create  
  nsDialogs::Create ${MYPAGE_SECOND}  
  Pop $Dialog2
  ${If} $Dialog2 == error
      Abort
  ${EndIf}

  ${NSD_CreateLabel} 0 0 100% 12u "SAE组件安装设置"
  SendMessage $HWNDPARENT ${WM_SETFONT} $FontHandle 0
  ${NSD_CreateLabel} 0 13u 100% 42u "请配置SAE组件的安装参数..."

  nsDialogs::Show  
FunctionEnd  

Function Page2Leave  
  ; 可以在这里处理第二页的表单验证或数据保存
FunctionEnd 

Function Page3Create  
  nsDialogs::Create ${MYPAGE_THIRD}  
  Pop $Dialog3
  ${If} $Dialog3 == error
      Abort
  ${EndIf}

  ${NSD_CreateLabel} 0 0 100% 12u "快速安装模式"
  SendMessage $HWNDPARENT ${WM_SETFONT} $FontHandle 0
  ${NSD_CreateLabel} 0 13u 100% 42u "将跳过SAE组件,直接完成主程序安装..."

  nsDialogs::Show  
FunctionEnd  

Function Page3Leave  
  ; 处理第三页的逻辑
FunctionEnd 

关键说明

  1. 页面模板ID 1018:nsDialogs::Create 1018会使用NSIS标准的安装对话框模板,包含导航按钮(上一步/下一步/取消),无需手动创建这些控件。
  2. 流程控制:通过全局变量g_InstallSAEChoice存储用户选择,在Page1Leave中使用SetCurPage $0 [页面索引]跳转到对应页面(页面索引从0开始,第一个自定义页是0,第二个是1,以此类推)。
  3. 单选按钮事件绑定:使用${NSD_OnClick}监听单选按钮点击,实时更新全局变量,确保选择结果准确。
  4. 字体设置:通过SendMessage $HWNDPARENT ${WM_SETFONT} $FontHandle 0将标题标签设置为加粗字体,符合安装程序的视觉规范。

内容的提问来源于stack exchange,提问作者李朋涛

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:20:07