最新消息:

实现 NSIS 自定义页面中的控件操作代码

nsis 永恒心锁 1365浏览 0评论

NSIS 中,自定义页面中,有一个 勾选框 和 一个 目录选择编辑框,能否实现勾选 CheckBox 后,目录选择编辑框 可用,如果不勾选,目录选择编辑框 变为不可用。
问题涉及到 NSIS 中自定义页面中的关于控件的消息传递问题,还有怎样进入回调函数处理的问题。
关于自定义页面的预先声明格式: Page custom [创建函数] [离开函数] [标题]
这里解释一下,关于自定义页面的控件回调处理,原来是在 [离开函数] 中处理的。以下是一个例子。另外,要注意 控件 在自定义页面中要设置 Flags 包含 NOTIFY 属性,才可以令程序在 [离开函数] 中处理相关操作。

!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
永恒心锁,版权所有丨如未注明,均为转载丨本网站采用BY-NC-SA协议进行授权

转载请注明:永恒心锁-分享互联网 » 实现 NSIS 自定义页面中的控件操作代码

您必须 登录 才能发表评论!