自定义页面中的控件操作

优质
小牛编辑
133浏览
2023-12-01
问题:

NSIS 中,自定义页面中,有一个 勾选框 和 一个 目录选择编辑框,能否实现勾选 CheckBox 后,目录选择编辑框 可用,如果不勾选,目录选择编辑框 变为不可用。

回答:

问题涉及到 NSIS 中自定义页面中的关于控件的消息传递问题,还有怎样进入回调函数处理的问题。

关于自定义页面的预先声明格式: Page custom [创建函数] [离开函数] [标题]

这里解释一下,关于自定义页面的控件回调处理,原来是在 [离开函数] 中处理的。以下是一个例子。另外,要注意 控件 在自定义页面中要设置 Flags 包含 NOTIFY 属性,才可以令程序在 [离开函数] 中处理相关操作。

引用 Setup.nsi 的内容:

/*----------------------------------------/ 
/ 关于 NSIS 自定义页面控件操作的简单脚本。/ 
/----------------------------------------*/ 

!include "MUI.nsh" 

Name "test" 
OutFile "Setup.exe" 

Var hwnd ; 自定义页面的窗口句柄 

Page custom PageInitFunc PageLeaveFunc  # 自定义页面 
!insertmacro MUI_PAGE_INSTFILES 

!insertmacro MUI_LANGUAGE "SimpChinese"  # 设置安装界面语言 

ReserveFile "io.ini" # 预先打包文件,方便安装加速释放 io.ini 

Function .onInit 
  InitPluginsDir 
  File /oname=$PLUGINSDIR\io.ini "io.ini"  ; 释放 io.ini 文件 
FunctionEnd 

Function PageInitFunc 
  InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\io.ini" 
  Pop $hwnd             ; 获取自定义页面的窗口句柄 
  InstallOptions::show  ; 显示自定义页面 
  Pop $0 
FunctionEnd 

Function PageLeaveFunc 
  ReadINIStr $0 "$PLUGINSDIR\io.ini" "Settings" "State"  ; 读取那个控件正在使用 state 就是 Field 后面的序数 
  StrCmp $0 0 NextBtn  ; 点击下一步按钮 
  StrCmp $0 1 CkBox  ; 点击 checkbox -- 1 为控件的 FieldNum 
  Goto NextBtn 
  CkBox: 
    ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 1" "State"  ; 获取checkbox 状态 
    GetDlgItem $1 $hwnd 1201 ; 控件句柄获取公式 (1200 + field 2 - 1) 
    EnableWindow $1 $0    ; 设置状态,根据 checkbox 
    GetDlgItem $1 $hwnd 1202 ; 目录设置按钮为 1200 加 1 后的控件 
    EnableWindow $1 $0   ; 设置状态,根据 checkbox 
;    GetDlgItem $1 $hwnd 1203 ; 如果还有控件要处理,公式变为 (1200 + field 3 - 1 + 1) 因为前面多了个浏览按钮,所以要再加 1 ,如此类推 
;    EnableWindow $1 $0 
    Abort    ; 禁止进入下一页面,因为点击的并不是“下一步”按钮 
  NextBtn: 
FunctionEnd 

Section "sec a" SEC1 
SectionEnd
引用 io.ini 的内容:

[Settings] 
NumFields=3 

[Field 1] 
Type=Checkbox 
Text=选我才能使用目录框 
Left=22 
Right=109 
Top=1 
Bottom=17 
Flags=NOTIFY 
State=1 

[Field 2] 
Type=DirRequest 
Left=114 
Right=275 
Top=1 
Bottom=16 

[Field 3] 
Type=Checkbox 
Text=第3个控件 
Left=133 
Right=198 
Top=33 
Bottom=44

效果如图:

资源文件:

点击另存