在NSIS中常常使用nsdialogs来制作界面,它可以将界面制作变得简单起来,你可以用nsdialogs来创建标签,文本框,单选框,多选框,按钮,下拉框,图片控件等等,虽然它很强大,但或多或少总有些地方它是不善长的,比如在左下角创建一个超级按钮,与其用API来苦苦的码代码,不如借用他人已经开发好的插件来实现这一效果,ButtonLinker插件,可以实现超级按钮的功能,除此之外还可以创建菜单,和多选框,功能强大,不能言表,只能带汝一睹它的风采.
/* #脚本范例# 编写:X-Star, zhfi 描述:利用插件与头文件创建超级按钮&链接&菜单,无需修改UI即可实现 资源:插件 'ButtonEvent.dll'、'linker.dll'、'System.dll' 及头文件 'ButtonLinkerLib.nsh' */
!AddPluginDir '.' !AddIncludeDir '.'
!include MUI2.nsh !include ButtonLinkerLib.nsh ;!include UsefulLib.nsh
; -------------------------------------------------- ; General settings.
Name 'ButtonLinker Example' OutFile 'ButtonLinkerMUI.exe' SetCompressor /SOLID lzma
;ReserveFile 'ButtonLinker.dll'
; -------------------------------------------------- ; MUI interface settings.
# We want to use our own UI with custom buttons! # The event handler for our parent button is added in MyGUIInit. !define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit # Don't skip to the finish page. !define MUI_FINISHPAGE_NOAUTOCLOSE
; -------------------------------------------------- ; Insert MUI pages.
; Installer pages !insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ButtonLinker.nsi
!insertmacro MUI_PAGE_INSTFILES
; UnInstaller pages !define MUI_CUSTOMFUNCTION_UnGUIINIT Un.MyGUIInit !insertmacro MUI_UnPAGE_WELCOME !insertmacro MUI_UnPAGE_INSTFILES
; -------------------------------------------------- ; Languages.
!insertmacro MUI_LANGUAGE 'SimpChinese'
/*定义要创建的控件ID*/ ;注意:ID不能重复,否则会产生未知错误! ;定义关于按钮 !ifndef IDC_BUTTON !define IDC_BUTTON 1190 !endif ;定义链接 !ifndef IDC_LINKER !define IDC_LINKER 1200 !endif ;定义复选框CheckBox2 !ifndef IDC_CheckBox2 !define IDC_CheckBox2 1210 !endif ;定义复选框CheckBox3 !ifndef IDC_CheckBox3 !define IDC_CheckBox3 1220 !endif ;定义关于菜单1 !ifndef IDM_ABOUT1 !define IDM_ABOUT1 1300 !endif ;定义关于菜单2 !ifndef IDM_ABOUT2 !define IDM_ABOUT2 1301 !endif
; -------------------------------------------------- ; 创建公共函数 !macro MYMACRO un
Function ${un}AboutButton MessageBox MB_OK|MB_ICONINFORMATION '关于按钮!' FunctionEnd
Function ${un}AboutMenu1 MessageBox MB_OK|MB_ICONINFORMATION '关于菜单1!' FunctionEnd Function ${un}AboutMenu2 MessageBox MB_OK|MB_ICONINFORMATION '关于菜单2!' FunctionEnd
Function ${un}CheckBox3 /*获取控件状态*/ ;用法:${GetBoxState} 输出变量(0/1/error) 父窗口窗口句柄 控件ID ${GetBoxState} $0 $HWNDPARENT ${IDC_CheckBox3} ; MessageBox MB_OK|MB_ICONINFORMATION '$0' ${if} $0 == 0 MessageBox MB_yesno|MB_ICONINFORMATION '取消选择?' idyes true idno false true: ${SetBoxState} 0 $HWNDPARENT ${IDC_CheckBox3} goto End false: ${SetBoxState} 1 $HWNDPARENT ${IDC_CheckBox3} goto End ${elseif} $0 == 1 MessageBox MB_yesno|MB_ICONINFORMATION '选择?' idyes true2 idno false2 true2: ${SetBoxState} 1 $HWNDPARENT ${IDC_CheckBox3} goto End false2: ${SetBoxState} 0 $HWNDPARENT ${IDC_CheckBox3} goto End ${else} MessageBox MB_OK|MB_ICONINFORMATION '$0!' ${endif} End: FunctionEnd
Function ${un}MyGUIInit InitPluginsDir
Pop $0 Pop $1 Pop $2 Pop $3
/*创建超级按钮*/ ;获取“取消”按钮的位置 ${GetDlgItemRect} $0 $1 $2 $3 $HWNDPARENT ${IDC_CANCEL} IntOp $2 $3 - $1 ;用法:${CreateButton2} 显示文本 X轴位置 Y轴位置 宽度 高度 父窗口窗口句柄 控件ID 目标函数 ;参考“取消”的位置来创建超级按钮 ${CreateButton2} '关于(&A)' 20 $1 80 $2 $HWNDPARENT ${IDC_BUTTON} ${un}AboutButton
/*创建超级链接*/ ;获取“取消”按钮的位置 ${GetDlgItemRect} $0 $1 $2 $3 $HWNDPARENT ${IDC_CANCEL} IntOp $2 $3 - $1 IntOp $1 $1 + 4 IntOp $2 $2 - 1 ;用法:${CreateLinker2} 显示文本 X轴位置 Y轴位置 宽度 高度 父窗口窗口句柄 控件ID 链接地址 ;参考“取消”的位置来创建超级链接 ${CreateLinker2} '访问我的主页' 120 $1 80 $2 $HWNDPARENT ${IDC_LINKER} 'http://hi.baidu.com/xstar2008'
/*创建超级复选框*/ ;获取“取消”按钮的位置 ${GetDlgItemRect} $0 $1 $2 $3 $HWNDPARENT ${IDC_CANCEL} IntOp $2 $3 - $1 IntOp $1 $1 + 4 IntOp $2 $2 - 1 ;用法:${CreateCheckBox2} 显示文本 X轴位置 Y轴位置 宽度 高度 父窗口窗口句柄 控件ID 控件状态(0/1) ;参考“取消”的位置来创建超级复选框 ${CreateCheckBox2} 'CheckBox2' 200 $1 50 $2 $HWNDPARENT ${IDC_CheckBox2} 1
;用法:${CreateCheckBox3} 显示文本 X轴位置 Y轴位置 宽度 高度 父窗口窗口句柄 控件ID 控件状态(0/1) 目标函数 ;参考“取消”的位置来创建超级复选框 ${CreateCheckBox3} 'CheckBox3' 250 $1 50 $2 $HWNDPARENT ${IDC_CheckBox3} 0 ${un}CheckBox3
/*创建超级菜单*/ ;用法:${CreateMenu2} 显示文本 菜单类型 父窗口窗口句柄 菜单ID 目标函数 ${CreateMenu2} 0 ${MF_SEPARATOR} $HWNDPARENT 0 ${un}MyGUIInit ${CreateMenu2} '关于菜单1(&A)' ${MF_STRING} $HWNDPARENT ${IDM_ABOUT1} ${un}AboutMenu1 ${CreateMenu2} '关于菜单2(&A)' ${MF_STRING} $HWNDPARENT ${IDM_ABOUT2} ${un}AboutMenu2
FunctionEnd
Function ${un}.onGUIEnd ButtonEvent::unload Linker::unload FunctionEnd
; -------------------------------------- !macroend
; 插入安装/卸载函数 !insertmacro MYMACRO '' !insertmacro MYMACRO 'un.' !insertmacro MYMACRO 'un'
Section 'Dummy' SecDummy /*获取控件状态*/ ;用法:${GetBoxState} 输出变量(0/1/error) 父窗口窗口句柄 控件ID ${GetBoxState} $0 $HWNDPARENT ${IDC_CheckBox2} StrCmp $0 1 0 +2 Messagebox MB_OK '你想干嘛?' Sleep 1000 WriteUninstaller '$Exediruninst.exe' SectionEnd
Section Uninstall Delete '$InstdirUninst.exe' SectionEnd