在nsis制作自定义界面中,目录选择页面个人感觉最为繁琐,因为该界面不仅涉及到界面控件的创建,还要涉及到控件消息传递和状态改变时的回调函数通告。
迅雷界面为例:
其中安装目录中的8盘符,在本机中并不存在,为避免用户安装出错,在控件的通告函数中禁用下一步,等待用户修改为可用磁盘。
Function OnChange
${NSD_GetText} $INST_SDAT_LOC $6 ;获取控件文本状态,这里是指安装目录框的文字,也就是安装路径。
StrCpy $INSTDIR $6 ;将值赋予常量
${GetRoot} "$INSTDIR" $R3 ;获取安装根目录
StrCpy $R0 "$R3\"
StrCpy $R1 "invalid"
${GetDrives} "ALL" "HDDDetection" ;获取将要安装的根目录磁盘类型
${If} $R1 == HDD ;是硬盘
GetDlgItem $R7 $HWNDPARENT 1
EnableWindow $R7 1
${Else}
GetDlgItem $R7 $HWNDPARENT 1
EnableWindow $R7 0
${endif}}
FunctionEnd
到了这一步,基本可以通过控件状态通告对安装路径是否有效进行自动处理。但还有一个问题,如果用户选择的目录有效,但磁盘剩余空间不足怎么办?原来想过在OnChange里面一起判断,后来经过测试发现,如果也一并单纯的禁用下一步,会让不太熟悉计算机的用户困惑,并且与上面的磁盘类型判断代码出现相同冲突,于是化繁为简,创建一个页面离开函数,在里面使用警告对话框提醒。
Function Page_leave
${NSD_GetText} $INST_SDAT_LOC $0
StrCpy $INSTDIR $0
${GetRoot} "$INSTDIR" $R3
StrCpy $R0 "$R3\"
${DriveSpace} "$R3\" "/D=F /S=M" $R0 #获取指定盘符的剩余可用空间,/D=F剩余空间, /S=M单位兆字节
${If} $R0 < 110 #110即程序安装后需要占用的实际空间,单位:MB
MessageBox MB_OK|MB_ICONEXCLAMATION "指定安装的分区剩余空间不足,请重新选择其它分区安装!"
Abort
${endif}
FunctionEnd
ok,虽然不是很规范,但彻底解决了关于路径判断的问题
手机扫一扫
移动阅读更方便
你可能感兴趣的文章