NSIS 的 Modern UI 教程

NSIS 2.0 版本支持定製的用戶界面。所謂的 Modern UI(下稱 MUI) 就是一種模仿最新的 Windows 界面風格的界面系統。MUI 改變了 NSIS 腳本的編寫習慣,它使用 NSIS 的宏來表達,指定 MUI 的屬性須要使用宏。因此,諸如 LicenseText, Icon, CheckBitmap, InstallColors 在 MUI 中失去意義。

MUI 的內置嚮導頁面
和安裝程序有關的嚮導頁面
MUI_PAGE_WELCOME 該向導頁面顯示歡迎信息
MUI_PAGE_LICENSE text/rtf_file 該向導頁面顯示軟件受權申明
MUI_PAGE_COMPONENTS 該向導頁面顯示安裝組件選擇
MUI_PAGE_DIRECTORY 該向導頁面顯示安轉目錄選擇
MUI_PAGE_STARTMENU page_id variable 該向導頁面顯示開始菜單目錄選擇
MUI_PAGE_INSTFILES 該向導頁面顯示安裝進度
MUI_PAGE_FINISH 該向導頁面顯示安裝結束

和卸載程序有關的嚮導頁面
MUI_UNPAGE_WELCOME
MUI_UNPAGE_CONFIRM
MUI_UNPAGE_LICENSE text/rtf_file
MUI_UNPAGE_COMPONENTS
MUI_UNPAGE_DIRECTORY
MUI_UNPAGE_INSTFILES
MUI_UNPAGE_FINISH

頁面的屬性設定須要放在插入頁面的宏以前。好比:
Var PLUGINS_FOLDER
!define MUI_DIRECTORYPAGE_VARIABLE $PLUGINS_FOLDER
!insertmacro MUI_PAGE_DIRECTORY
這段 nsi 腳本表示,將目錄選擇頁面中用戶選擇的目錄位置存放到變量 $PLUGINS_FOLDER 中去。

如下是 MUI 各個內置嚮導頁面屬性說明:
全部頁面適用的屬性
MUI_PAGE_HEADER_TEXT text
顯示在嚮導頁頭上的文字

MUI_PAGE_HEADER_SUBTEXT text
顯示在嚮導頁頭上的文字,它是一般顯示在 MUI_PAGE_HEADER_TEXT 之下,表示對 MUI_PAGE_HEADER_TEXT 的進一步解釋。
對於使用 InstallOptions 的定製界面,使用宏 !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)" 實現相似功能。

歡迎頁面屬性
MUI_WELCOMEPAGE_TITLE title
顯示在歡迎向導頁上的標題

MUI_WELCOMEPAGE_TITLE_3LINES
標題區的空格

MUI_WELCOMEPAGE_TEXT text
顯示在歡迎向導頁上的文字。使用\r\n換行。
一般這些屬性不須要制定,省缺的值已經足夠。

軟件受權頁面屬性
在軟件受權頁面中能夠定製用戶接受軟件受權許可的三種方式,一是按鈕,二是 checkbox,三是 radio。
MUI_LICENSEPAGE_TEXT_TOP text
顯示在頁面頂部的文字

MUI_LICENSEPAGE_TEXT_BOTTOM text
顯示在頁面底部的文字

MUI_LICENSEPAGE_BUTTON button_text
按鈕方式時按鈕上的文字

MUI_LICENSEPAGE_CHECKBOX
定義此宏表示用戶須要鉤選該 checkbox 來接受軟件許可

MUI_LICENSEPAGE_CHECKBOX_TEXT text
在 checkbox 旁顯示的文字

MUI_LICENSEPAGE_RADIOBUTTONS
定義此宏表示用戶須要鉤選相應的 radio box 來接受或拒絕軟件許可

MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT text
在 radio 旁顯示的表示接受的文字

MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE text
在 radio 旁顯示的表示拒絕的文字

安裝組件選擇頁面屬性

MUI_COMPONENTSPAGE_TEXT_TOP text
顯示在頁面頂部的文字

MUI_COMPONENTSPAGE_TEXT_COMPLIST text
顯示在組件列表旁邊的文字

MUI_COMPONENTSPAGE_TEXT_INSTTYPE text
顯示在安轉類型下拉框旁邊的文字

MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE text
顯示在描述框頂部的文字

MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO text
當沒有安裝組件選中時,顯示在描述框中的文字

安裝目錄選擇頁面屬性

MUI_DIRECTORYPAGE_TEXT_TOP text
顯示在頁面頂部的文字

MUI_DIRECTORYPAGE_TEXT_DESTINATION text
顯示在目地目錄選擇框上的文字

MUI_DIRECTORYPAGE_VARIABLE variable
存放用戶選擇的目錄的變量,默認是 $INSTDIR

MUI_DIRECTORYPAGE_VERIFYONLEAVE
在離開該頁面時驗證目錄的有效性,不由用"下一步"這個按鈕

開始菜單目錄選擇頁面

建立快捷方式的代碼應當放在 MUI_STARTMENU_WRITE_BEGIN 和 MUI_STARTMENU_WRITE_END 之間,示例以下:
!insertmacro MUI_STARTMENU_WRITE_BEGIN page_id
...create shortcuts...
!insertmacro MUI_STARTMENU_WRITE_END

這裏的 page_id 是用戶選擇要建立快捷方式的頁面。

MUI_STARTMENUPAGE_TEXT_TOP text
顯示在頁面頂部的文字

MUI_STARTMENUPAGE_TEXT_CHECKBOX text
顯示在 checkbox 旁的表示禁止快捷方式建立的文字

MUI_STARTMENUPAGE_DEFAULTFOLDER folder
默認的開始菜單目錄

MUI_STARTMENUPAGE_NODISABLE
不實現用於禁止快捷方式建立的 checkbox

MUI_STARTMENUPAGE_REGISTRY_ROOT root
MUI_STARTMENUPAGE_REGISTRY_KEY key
MUI_STARTMENUPAGE_REGISTRY_VALUENAME value_name
這三項用於指定開始菜單設定在註冊表中的鍵和值,用於記錄用戶的偏好。在卸載時應當刪除之。
卸載程序能夠用宏MUI_STARTMENU_GETFOLDER得到開始菜單目錄,下面的例子說明了如何刪除快捷方式:
!insertmacro MUI_STARTMENU_GETFOLDER page_id $R0
Delete "$SMPROGRAMS\$R0\Your Shortcut.lnk"

安裝進度頁面屬性

MUI_INSTFILESPAGE_FINISHHEADER_TEXT text
顯示安裝進度頁面頭上的文字,但對於結束頁面不是MUI_(UN)FINISHPAGE_NOAUTOCLOSE)不顯示。

MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT text
顯示安裝進度頁面頭上的,對MUI_INSTFILESPAGE_FINISHHEADER_TEXT的進一步說明。對於結束頁面不是MUI_(UN)FINISHPAGE_NOAUTOCLOSE)不顯示。

MUI_INSTFILESPAGE_ABORTHEADER_TEXT text
顯示安裝進度頁面頭上的表示安裝過程非正常終止的文字

MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT text
對MUI_INSTFILESPAGE_ABORTHEADER_TEXT的進一步描述

完成頁面屬性

在完成頁面中能夠運行程序,打開文件或網站。

MUI_FINISHPAGE_TITLE title
頁面標題

MUI_FINISHPAGE_TITLE_3LINES
頁面標題區的額外空格

MUI_FINISHPAGE_TEXT text
顯示在完成頁面上文字,用\r\n換行

MUI_FINISHPAGE_TEXT_LARGE
若是使用了 checkbox 時,須要設定的文本區的額外空間

MUI_FINISHPAGE_BUTTON text
完成按鈕的顯示文字

MUI_FINISHPAGE_TEXT_REBOOT text
重啓操做系統 checkbox 旁的文字,用\r\n換行

MUI_FINISHPAGE_TEXT_REBOOTNOW text
顯示在'Reboot now'旁的文字

MUI_FINISHPAGE_TEXT_REBOOTLATER text
顯示在'Reboot later'旁的文字

MUI_FINISHPAGE_RUN exe_file
指定用戶能夠用 checkbox 選擇運行的應用程序,若是有空格無需引用。

MUI_FINISHPAGE_RUN_TEXT text
運行應用程序 checkbox 旁的文字

MUI_FINISHPAGE_RUN_PARAMETERS parameters
運行應用程序的參數,須要用$\"表示雙引號

MUI_FINISHPAGE_RUN_NOTCHECKED
指定運行應用程序 checkbox 爲非選中狀態

MUI_FINISHPAGE_RUN_FUNCTION function_name
指定安裝完成後要執行的nsi函數,在該函數中能夠運行多個應用程序。

MUI_FINISHPAGE_SHOWREADME file/url
指定用戶能夠用 checkbox 選擇是否查看的文件或網站,若是有空格無需引用。

MUI_FINISHPAGE_SHOWREADME_TEXT text
指定 'Show Readme' checkbox 旁的顯示文字

MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
指定 'Show Readme' checkbox 爲非選中狀態

MUI_FINISHPAGE_SHOWREADME_FUNCTION function_name
指定安裝完成後要執行的 nsis 函數,在該函數中能夠顯示多個文件或網站。

MUI_FINISHPAGE_LINK link_text
用戶可及點擊的超鏈上的文字

MUI_FINISHPAGE_LINK_LOCATION file/url
指定用戶是否能夠用超鏈查看網站,若是有空格無需引用。

MUI_FINISHPAGE_LINK_COLOR (color: RRGGBB hexadecimal)
超鏈上文字的顏色,默認爲 000080

MUI_FINISHPAGE_NOREBOOTSUPPORT
禁用重啓操做系統的功能

卸載確認頁面屬性

MUI_UNCONFIRMPAGE_TEXT_TOP text
顯示在頁面頂部的文字

MUI_UNCONFIRMPAGE_TEXT_LOCATION text

顯示在 uninstall location 旁的文字 算法

InstallOptions 和定製頁面
InstallOptions 是一個 NSIS 插件,他能讓安裝程序開發人員建立定製的嚮導頁面來得到內置嚮導頁面不能提供的用戶輸入。

InstallOptions 會建立內嵌在 NSIS 窗體中的對話框。InstallOptions 的控件用 INI 文件描述。該文件能夠用可視化工具生成。HM NIS EDIT 就是這樣的一個工具。

InstallOptions 控件 INI 文件的結構
InstallOptions INI 文件包含一個必須的段。它包含了控件的數量、窗體的屬性等。該文還可包含描述具體空間的段。
必須的段是 Settings,它能夠包含如下內容:
NumFields(必須的) 該對話框包含的控件數目
Title (可選的) Windows窗體的標題
CancelEnabled (可選的) 是否啓用Cancel按鈕,1:是,0:否
CancelShow (可選的) 是否顯示Cancel按鈕,1:是,0:否
BackEnabled (可選的) 是否啓用Back按鈕,1:是,0:否
CancelButtonText (可選的) Cancel按鈕的顯示文字
NextButtonText (可選的) Next按鈕的顯示文字
BackButtonText (可選的) Back按鈕的顯示文字
Rect (可選的)
RTL (可選的)
State (output) This is not something you have to supply yourself but is set by InstallOptions, before calling your custom page validation function, to the field number of the custom Button control (or other control having the Notify flag) the user pressed, if any.

每一個控件段以"Field #"模式命名,井號表示數字,從1開始。控件有如下屬性:

Type (required) 控件的類型,有"Label", "Text", "Password", "Combobox", "DropList", "Listbox", "CheckBox", "RadioButton", "FileRequest" , "DirRequest" "Icon", "Bitmap", "GroupBox", "Link" 或 "Button"。

"Label" 用來顯示靜態文本
"Text" 和 "Password" 和 HTML 中的相似,用來接受用戶輸入。
"Combobox"容許用戶輸入列表中不存在的項, "Droplist" 則只能選擇列表中規定的項。
"Listbox" 顯示多個選項(不用下拉便可看到),並容許多選
"CheckBox" "RadioButton" 和 Windows中的相應控件相似。
"FileRequest" 顯示一個輸入框和瀏覽按鈕,容許用戶用文件選擇對話框選取文件。
"DirRequest" 和 "FileRequest" 相似,但只選取到目錄。
"Icon" 顯示圖標
"Bitmap" 顯示位圖
"GroupBox" 顯示組合框
"Link" 顯示超鏈
"Button" 按鈕

Text (可選的) 對 checkbox,radio button 控件是 caption;對 DirRequest 控件是瀏覽對話框的標題;對圖標,位圖控件是圖像文件的的路徑。

State (可選的) 控件狀態,該狀態能夠在 nsi 腳本讀取。對於文本類型的控件,state 的值是用戶輸入的字符串。對於 radio button 和 check boxes state 爲'0'或'1'。對 list boxes, combo boxes 和 drop lists 狀態值是選中的選項,若是有多個則用管道符號'|'分割。 對於超鏈和按鈕 State 是能夠用 ShellExecute 執行的字符串。

ListItems (可選的) combobox, droplist, 或 listbox的選項,選項之間用管道符號'|'分割
MaxLen (可選的) 最大輸入長度
MinLen (可選的) 最小輸入長度
ValidateText (可選的) 校驗文本

Left
Right
Top
Bottom (required) 控件座標,在可視化環境中不重要。
Filter (可選的) 指定 "FileRequest" 控件的文件過濾器,模式如 文本文件|*.txt|程序文件|*.exe;*.com|全部文件|*.*

Root (可選的) 指定"DirRequest" 控件的根目錄
Flags (可選的) 指定控件的修飾。多個值用管道符號'|'分割且不能有空格。有效的值以下:
Value Meaning
REQ_SAVE 將 "FileRequest" 控件變成 "另存爲" 對話框
FILE_MUST_EXIST 用於 "FileRequest" 控件,規定所選文件是否必須存在
FILE_EXPLORER 用於 "FileRequest" 控件
FILE_HIDEREADONLY 用於 "FileRequest" 控件,隱藏 "open read only"checkbox
WARN_IF_EXIST 用於 "FileRequest" 控件,顯示警告若是文件已存在
PATH_MUST_EXIST 用於 "FileRequest" 控件,規定輸入的路徑必須存在
PROMPT_CREATE 用於 "FileRequest" 控件,在建立以前顯示警告若是文件或路徑不存在
RIGHT 用於"Checkbox"和Radiobutton"控件,規定文字出如今左邊,不多用
MULTISELECT 用於"Listbox"控件容許多選
EXTENDEDSELCT 用於"Listbox"控件容許多選
RESIZETOFIT 用於"Bitmap"控件,將圖片擴大到控件的大小
GROUP 多個控件分組,該標誌放在同組的第一個控件上。
NOTABSTOP 禁止tab鍵焦點落在該控件上
DISABLED 禁用控件
ONLY_NUMBERS 用於"Text"控件,Forces the user to enter only numbers into the edit box.
MULTILINE 用於"Text"控件,容許多行輸入
WANTRETURN 用於"Text"控件,容許多行輸入,規定按下Enter鍵時插入回車
NOWORDWRAP 用於"Text"控件,容許多行輸入禁用word-wrap
HSCROLL 顯示水平方向的滾動條
VSCROLL 顯示垂直方向的滾動條
READONLY 用於"Text"控件,使文本輸入框變成只讀
NOTIFY 用於"Button", "Link", "CheckBox", "RadioButton", "ListBox"和"DropList"控件。使InstallOptions觸發事件,調用定製頁面的validation/leave方法。
TxtColor (可選的) 用於"Link"控件,指定文本的前景色,格式爲: 0xBBRRGG (十六進制)

使用定製嚮導頁的步驟:
1. 設計定製嚮導頁界面,產生界面描述ini文件,可使用HM NIS Edit的可視化工具簡化開發
2. 編寫nsi腳本:
首先,若是使用了lzma,gzip等壓縮算法,須要在全部File指令前reserve定製界面的ini文件:ReserveFile ".ini"。
而後,在.onInit方法中使用宏!insertmacro MUI_INSTALLOPTIONS_EXTRACT ".ini"。
接着,編寫定製對話框的顯示函數。
最後,用Page指令在合適的位置插入該向導頁面。

定製對話框顯示函數的示例:
Function setChooseBuildArea
!insertmacro MUI_HEADER_TEXT "請選擇構建目錄" "請選擇構建目錄"
!insertmacro MUI_INSTALLOPTIONS_WRITE "buildarea.ini" "Field 2" "State" "$INSTDIR\buildarea"
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "buildarea.ini"
FunctionEnd
該函數的第一行代碼設置嚮導頁面的頭上的文字;第二行代碼設置嚮導頁面第二個控件的State爲"$INSTDIR\buildarea",也就是設置該控件的默認值;第三行代碼顯示對話框。
用Page指令插入嚮導頁的代碼以下:
Page custom setChooseBuildArea "" "--選擇構建目錄"
該指令接受三個參數,前兩個是該頁面的顯示函數和離開函數,第三個是顯示在標題欄的文字。

nsi的變量若是存放字符串的話,默認只能保存1024。對於複雜的Java應用,因爲須要設置Classpath其命令行的長度每每會超過1024。此時,必須讓nsi的變量支持大於1024的字符串長度。有兩種方法解決此問題,一個是到http: //nsis.sourceforge.net/download/specialbuilds/處下載Special Builds,目前一個稱爲Large strings的build支持能夠存放8192個字符的變量;另一個就是手工編譯NSIS的源代碼,加上須要的選項。
函數

相關文章
相關標籤/搜索