NSIS自定义目录选择页面制作之安装…
阅读原文时间:2023年07月10日阅读:1

在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,虽然不是很规范,但彻底解决了关于路径判断的问题