2

我想使用 NSIS 创建一个 Web 下载安装程序。我从安装 flash 中捕获了以下屏幕截图,这正是我想要创建自己的安装程序,它还下载了一些文件然后执行。

闪存安装

按关闭按钮 Flash 安装中断

闪存安装完成

我已经尝试过 NSIS 现代 UI 和 nsDialogs,但我发现我很难自定义看起来像上面的页面。我在这里遇到的问题是,

  1. 如何调整页面大小?我找不到随意更改页面大小的方法。
  2. 如何将整个背景更改为我想要的颜色?
  3. 如何删除所有默认按钮(后退/下一个/取消),但仍需要右上角的关闭按钮工作?我发现如果我隐藏下一个或完成按钮,关闭按钮也将被禁用。
  4. 如何自定义进度条以指示下载和安装的合理进度?
  5. 安装过程中,点击右上角关闭按钮,如何在当前页面显示警告信息而不是弹出对话框?

作为 NSIS 初学者,我非常感谢您的帮助/建议/指导。提前致谢,

4

2 回答 2

3

我认为标题栏关闭按钮不关心其他按钮是否隐藏,但它确实关心您是否在 InstFiles 页面上以及是否在最后一页等。

您可以使用ChangeUI属性更改 UI 布局。您也可以在运行时执行此操作:

Outfile "setup.exe"
Name "Wannabe UI"
Caption "$(^Name)"
RequestExecutionLevel user
XPStyle off
AutoCloseWindow true

!include nsDialogs.nsh
!include WinMessages.nsh
!include LogicLib.nsh
!define PBM_SETBARCOLOR 0x409
!define PBM_SETBKCOLOR 0x2001

!define CLRTXT ffffff
!define CLRBKG 353535

Page Custom mypagecreate
Page InstFiles

!macro SetPixelSize w h
System::Call 'USER32::SetWindowPos(i$hwndparent,i0,i0,i0,i${w},i${h},i0x1a)'
GetDlgItem $0 $hwndparent 0x3fa
System::Call 'USER32::SetWindowPos(i$0,i0,i0,i0,i${w},i${h},i0x10)'
!macroend
!macro DisableWindowClose disable
System::Call 'USER32::GetSystemMenu(i$hwndparent,i0)i.r0'
System::Call 'USER32::EnableMenuItem(ir0,i0xF060,i${disable})'
!macroend

var progbar
var progtxt
var button

Function mypagecreate
!insertmacro DisableWindowClose 1
!insertmacro SetPixelSize 400 200 
SetCtlColors $hwndparent 0x${CLRTXT} 0x${CLRBKG}
GetDlgItem $1 $hwndparent 1
ShowWindow $1 0
GetDlgItem $1 $hwndparent 2
ShowWindow $1 0
GetDlgItem $1 $hwndparent 0x404
ShowWindow $1 0
nsDialogs::Create 1018
Pop $0

${NSD_CreateLabel} 5% 13u 100% 10u "Some text here?"
Pop $0
SetCtlColors $0 0x${CLRTXT} 0x${CLRBKG}

${NSD_CreateProgressBar} 5% 25u 83% 10u ""
Pop $progbar
${NSD_AddStyle} $progbar 1 ;PBS_SMOOTH
SendMessage $progbar ${PBM_SETBARCOLOR} 0 0xee8888
SendMessage $progbar ${PBM_SETBKCOLOR} 0 0x${CLRBKG}

${NSD_CreateLabel} -27u 25u 19u 10u ""
Pop $progtxt
SetCtlColors $progtxt 0x${CLRTXT} 0x${CLRBKG}

${NSD_CreateButton} -60u -35u 50u 12u "&Close" 
Pop $button
ShowWindow $button 0
; NSIS cannot color a button, you have to use a plugin to do it, 
; or you could use a image...
;SetCtlColors $button 0x${CLRTXT} 0x${CLRBKG}
${NSD_OnClick} $button done

FindWindow $0 "#32770" "" $hwndparent ; Find inner dialog
SetCtlColors $0 0x${CLRTXT} 0x${CLRBKG}
${NSD_CreateTimer} emulatework 300
nsDialogs::Show
FunctionEnd

Function emulatework
SendMessage $progbar ${PBM_GETPOS} 0 0 $0
IntOp $0 $0 + 3
${If} $0 >= 100
    ${NSD_KillTimer} emulatework
    !insertmacro DisableWindowClose 0
    ShowWindow $button 1
    StrCpy $0 100
${EndIf}
SendMessage $progbar ${PBM_SETPOS} $0 0
${NSD_SetText} $progtxt "$0%"
FunctionEnd

Function done
SendMessage $hwndparent ${WM_CLOSE} 0 0
FunctionEnd

Section
SectionEnd

您必须使用插件来下载文件,也许InetBgDL非常适合这种类型的 UI...

于 2013-05-24T17:27:30.970 回答
0

(1) 最好使用资源编辑器,尽管我认为有一个nsis插件可以让你在运行时做到这一点

(2-4) 有几个插件可以改变安装程序的外观。看看蒙皮控件蒙皮工匠蒙皮按钮

(5) 使用.onInstFailed函数

于 2013-05-24T17:25:15.213 回答