NSIS實現軟件的捆綁安裝

前幾天完成了一個需求——在軟件的安裝程序完成頁面提供了安裝其餘軟件的checkbox選項。
實現效果以下圖:


在NSIS界面上添加checkbox,目前我知道有三種方法:
我維護的代碼,沒有采用MUI2,然而從MUI升到MUI2不是一兩行代碼能搞定的事情。此次採用了修改ini配置文件的方法實現,其中參考如下兩個地方:


finish頁面對應的ini爲$PLUGINSDIR\ioSpecial.ini,至於$PLUGINSDIR的目錄,每次都不同,在進入finish頁面前,用MessageBox MB_OK $PLUGINSDIR阻塞頁面並查看一下ioSpecial.ini的結構。
經過觀察能夠發現,在finish頁面,若是沒有閱讀說明和運行選項時,只有3個控件。每多一項,就多一個控件。
下圖是一個配置了閱讀說明和運行選項的ioSpecial.ini


因此,要增長一個checkbox控件,只要按照[Field 5]的結構,在finish的PRE函數中,在ini中插入一個相同結構的[Field 6]就能夠了!! php

好了,能夠着手寫代碼了! html

以下代碼是在配置了「閱讀說明」和「運行」選項的finish界面中,添加了一個「setup」的checkbox。勾選的話,會彈出「select」,不然彈出「not select」。
這份示例代碼,作幾點說明:
  • checkbox要根據finish頁面控件的狀況,擺放到適合的位置。
  • finish_show中,把checkbox設置成白底黑字。若是不這樣,那麼新增的checkbox的背景是灰色的。
  • 若是不想在finish頁面顯示「運行」和「閱讀說明」選項,除了更改代碼外,還須要在finish_pre函數中加上一行:WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 3" "Bottom" "85"。由於在這種狀況下,field3控件的範圍很大,這樣會遮住你新增的checkbox,每次要把鼠標移到該位置才能顯示。
  • 若是想新增幾個控件,注意一下checkbox的位置和控件的總數,而後把Field3的範圍改小就能夠了。你也能夠作一個nsis腳本生成工具,這樣的話,若是要更改finish頁面上的checkbox數量,就不用手動寫nsis代碼了。
!define MUI_PAGE_CUSTOMFUNCTION_PRE finish_pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW finish_show
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE finish_leave
!insertmacro MUI_PAGE_FINISH

Function finish_pre
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Settings" "NumFields" "6"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Type" "CheckBox"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Text" "setup"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Left" "120"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Right" "315"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Top" "150"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "Bottom" "160"
  WriteINIStr "$PLUGINSDIR\iospecial.ini" "Field 6" "State" "1"
FunctionEnd

Function finish_show 
  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 6" "HWND"
  # 設置白底黑字
  SetCtlColors $0 0x000000 0xFFFFFF
FunctionEnd

Function finish_leave
  Var /GLOBAL finish_page_field6_state
  !insertmacro MUI_INSTALLOPTIONS_READ $finish_page_field6_state "ioSpecial.ini" "Field 6" "State"
  ${If} $finish_page_field6_state == "1"
    MessageBox MB_OK "select"
  ${Else}
    MessageBox MB_OK "not select"
  ${EndIf}
FunctionEnd
相關文章
相關標籤/搜索