NSIS制作Windows8風格安裝界面(模仿Visual Studio 2012的主題和顏色)


NSIS借助一些插件可以制作出界面很漂亮的安裝程序,SkinSE就是使用的比較多的一個插件,迅雷和QQ的安裝程序就是NSIS+SkinSE制作的。我比較喜歡windows8風格的界面,所以這次模仿一個Visual Studio2012界面的安裝程序。

這次模仿只修改了使用到的控件的主題,未使用的控件圖片不進行修改(我PS不是很好,修改圖片很痛苦的),修改內容包括Button,CheckBox,最大化按鈕,最小化按鈕,菜單,滾動條,窗體背景圖,分隔符,進度條。在修改的過程中遇到3個問題暫時還沒法解決:

1.控件獲取焦點后的文字的顏色沒法修改,現在顏色默認為黑色,通過幾種方式修改均未發現有效果

2.選擇安裝目錄的界面,如果使用SkinSE,界面默認只能看見背景圖片,需要將鼠標移動過去才會顯示其他信息(這個只會在windows7才出現,windows xp下正常)。如下圖所示

3.安裝進度界面如果使用自定義頁面沒法獲取安裝的具體進度

有能解決以上3個問題的朋友請告訴我一下。

下面是安裝界面的截圖和腳本代碼(安裝程序的文字說明和圖片使用即將發布的一款軟件里面的截圖和描述):

主題圖片下載:http://files.cnblogs.com/loyldg/skin.rar

 

 

 

 

 

 

NSIS腳本:

!system '>blank set/p=MSCF< '
!packhdr temp.dat 'cmd /c Copy /b temp.dat /b + blank && del blank'
!AddPluginDir .
SetCompressor /solid lzma
SetCompressorDictSize 32

!include "MUI2.nsh"
!include "LogicLib.nsh"
!include "LoadRTF.nsh"

!define MUI_UI MetroUI.exe
!define MUI_FINISHPAGE_RUN "$INSTDIR\AutoCall.exe"
!define PRODUCT_VERSION "1.0.0.0"
!define PRODUCT_PUBLISHER "Loyldg"
!define PRODUCT_WEB_SITE "http://www.loyldg.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\AutoCall\autocall.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define EM_SETBKGNDCOLOR 1091

!define MUI_PAGE_HEADER_TEXT " "
!define MUI_PAGE_HEADER_SUBTEXT " "
!define TextColor "999999"
!define MUI_ICON "img\AutoCall.ico"

Name "AutoCall"
OutFile "MetroUITest.exe"
AutoCloseWindow true
Caption "AutoCall安裝"

RequestExecutionLevel admin
ShowInstDetails  nevershow
ShowUninstDetails NeverShow
SilentUnInstall silent
MiscButtonText "上一歩" "下一步" "取消" "完成"
InstallButtonText "下一歩"
BrandingText " "
InstProgressFlags  smooth


!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
Page custom WelcomePage
Page custom ChooseInstallDirPage
!define MUI_PAGE_CUSTOMFUNCTION_SHOW CreateStaticRect1
!insertmacro MUI_PAGE_INSTFILES
Page custom InstallFinishPage AfterInstallFinish
!insertmacro MUI_LANGUAGE "SimpChinese"
InstallDir "$PROGRAMFILES\Loyldg\AutoCall"


Var ImageHandle
Var Checkbox1
var Checkbox2
Var steps
var rtxt

Function .onInit
  InitPluginsDir
  File "/oname=$PLUGINSDIR\step1.bmp" "img\a\step1.bmp"
  File "/oname=$PLUGINSDIR\step2.bmp" "img\a\step2.bmp"
  File "/oname=$PLUGINSDIR\step3.bmp" "img\a\step3.bmp"
  File "/oname=$PLUGINSDIR\step4.bmp" "img\a\step4.bmp"
  File "/oname=$PLUGINSDIR\multiTheme.bmp" "img\a\multiTheme.bmp"
  File "/oname=$PLUGINSDIR\main.bmp" "img\a\main.bmp"
  File "/oname=$PLUGINSDIR\tasklist.bmp" "img\a\tasklist.bmp"
  File "/oname=$PLUGINSDIR\about.bmp" "img\a\about.bmp"
  File "/oname=$PLUGINSDIR\line.bmp" "img\a\line.bmp"
  File "/oname=$PLUGINSDIR\license.rtf" "license.rtf"
FunctionEnd

#=======================初始化界面皮膚======================================================================================================
Function myGuiInit
InitPluginsDir
  File "/oname=$PLUGINSDIR\theme.zip" "theme\theme.zip"
  File "/oname=$PLUGINSDIR\SkinSE.dll" "SkinSE.dll"
  SetOutPath $PLUGINSDIR
  SkinSE_NSIS::setskinpath /NOUNLOAD "$PLUGINSDIR\theme.zip"
  System::Call SkinSE::SkinSE_Menu_EnableSkin(i1)
 ;創建互斥防止重復運行
  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "autocall_installer") i .r1 ?e'
  Pop $R0
  StrCmp $R0 0 +3
    MessageBox MB_OK|MB_ICONEXCLAMATION "已經有一個AutoCall安裝向導正在運行! "
    Abort
FunctionEnd

Function .onGUIEnd
  SkinSE::UnstallSkinSE
  System::Call Kernel32::GetModuleHandle(t"SkinSE_NSIS.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

#===============================歡迎界面====================================================================================
Function WelcomePage
         SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:AutoCall 歡迎安裝AutoCall"
         nsDialogs::Create /NOUNLOAD 1018
     Pop $0
         ${If} $0 == error
        Abort
     ${EndIf}
        System::Call SkinSE::SkinSE_Init(i$HWNDPARENT,i1)
     ${NSD_CreateLabel} 10u 14u 290u 8u "在安裝軟件前,請仔細閱讀下面的軟件許可協議"
     Pop $0
     SetCtlColors $0 ${TextColor} transparent

  nsDialogs::CreateControl "RichEdit20A" \
    "${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_READONLY}" \
    "${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE}" 9u 28u 337u 132u ""
        Pop $rtxt
        ${LoadRTF} "$PLUGINSDIR\license.rtf" $rtxt

    ${NSD_CreateCheckbox} 10u 166u 155u 15u "我已閱讀並同意軟件許可協議書"
       Pop $Checkbox1
     ${NSD_OnClick} $Checkbox1 onCheckbox1

     setctlcolors $Checkbox1 "999999" transparent
     SendMessage $rtxt ${EM_SETBKGNDCOLOR} 0 0x303030
     GetDlgItem $steps $HWNDPARENT 1
     EnableWindow $steps 0

 ${NSD_CreateBitmap} 0u 210u 100% 1u ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\line.bmp $ImageHandle

  ${NSD_CreateBitmap} 245u 190u 100% 100% ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\step1.bmp $ImageHandle

    nsDialogs::Show
    ${NSD_FreeImage} $ImageHandle
FunctionEnd
#---------------------------------------------------------------------------------------------------------------------#

#=======================選擇安裝目錄===================================================================================
Function ChooseInstallDirPage

SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:AutoCall 選擇安裝路徑"
    nsDialogs::Create /NOUNLOAD 1018
      Pop $0
    ${If} $0 == error
        Abort
    ${EndIf}

  ${NSD_CreateLabel} 10u 27u 70u 10u "程序安裝目錄"
     Pop $0
     SetCtlColors $0 ${TextColor} transparent

  ${NSD_CreateBitmap} 0u 10u 100% 1u ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\line.bmp $ImageHandle
  ${NSD_CreateDirRequest} 60u 23u 225u 12u $INSTDIR
       Pop $1
  ${NSD_CreateButton} 300u 23u 45u 15u "瀏覽(&B)"
       Pop $0
       ${NSD_OnClick} $0 OnDirRequest

  ${NSD_CreateBitmap} 10u 55u 100% 5u ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\multiTheme.bmp $ImageHandle

  SetCtlColors $0 "" transparent

     ${NSD_CreateBitmap} 0u 210u 100% 1u ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\line.bmp $ImageHandle

        ${NSD_CreateBitmap} 245u 190u 100% 100% ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\step2.bmp $ImageHandle

System::Call SkinSE::SkinSE_Init(i$HWNDPARENT,i1)
    nsDialogs::Show
    ${NSD_FreeImage} $ImageHandle
FunctionEnd
#-----------------------------------------------------------------------------------------#

Function onCheckbox1
    Pop $Checkbox1
    SendMessage $Checkbox1 ${BM_GETCHECK} 0 0 $0
    EnableWindow $steps $0
FunctionEnd

function onCheckbox2
         pop $Checkbox2
         sendmessage $checkbox2 ${BM_GETCHECK} 0 0 $0
functionend
#-----------------------------------------------------------#
Function OnDirRequest
    nsDialogs::SelectFolderDialog /NOUNLOAD "$\n請選擇目錄" ""
       Pop $0
    ${If} $0 != error
     ${NSD_SetText} $1 $0
    ${EndIf}
FunctionEnd
#-----------------------------------------------------------#

#=========================顯示主界面圖片=================================================================
Function CreateStaticRect1
SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:AutoCall 正在安裝..."
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $0 59
${NSD_SetImage} $R0 "$PLUGINSDIR\main.bmp" $ImageHandle

functionend

Function HideImageCtrl
         FindWindow $0 "#32770" "" $HWNDPARENT
         GetDlgItem $R0 $0 59
         ShowWindow $R0 ${SW_HIDE}
         GetDlgItem $R0 $0 1202
         ShowWindow $R0 ${SW_HIDE}
functionend

#==============================安裝完成頁面========================================================================
Function InstallFinishPage
SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:AutoCall 安裝完成"
call HideImageCtrl

GetDlgItem $0 $HWNDPARENT 3
  ShowWindow $0 ${SW_HIDE}
         nsDialogs::Create /NOUNLOAD 1018
      Pop $0
    ${If} $0 == error
        Abort
    ${EndIf}

  ${NSD_CreateLabel} 10u 18u 60u 10u "安裝完成"
  Pop $0
  SetCtlColors $0 ${TextColor} transparent


${NSD_CreateBitmap} 0u 10u 100% 1u ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\line.bmp $ImageHandle

 ${NSD_CreateBitmap} 0u 55u 100% 5u ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\about.bmp $ImageHandle

    ${NSD_CreateCheckbox} 68u 32u 140u 15u "立即運行AutoCall"
        Pop $Checkbox2
        ${NSD_Check} $Checkbox2
        ${NSD_OnClick} $Checkbox2 onCheckbox2
        setctlcolors $Checkbox2 "" C5DEF0
        
   ${NSD_CreateBitmap} 0u 210u 100% 1u ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\line.bmp $ImageHandle

  ${NSD_CreateBitmap} 245u 190u 100% 100% ""
    Pop $0
    ${NSD_SetImage} $0 $PLUGINSDIR\step4.bmp $ImageHandle

System::Call SkinSE::SkinSE_Init(i$HWNDPARENT,i1)
    nsDialogs::Show
    ${NSD_FreeImage} $ImageHandle
FunctionEnd
#-----------------------------------------------------------------------------------------#

#=======================安裝完成后要執行的操作============================================
Function AfterInstallFinish
         ${NSD_GetState} $Checkbox2 $0
         ${if} $0 == 1
               exec "$INSTDIR\AutoCall.exe"
         ${endif}
         quit
FunctionEnd

#========================卸載===================================================================
Function un.onInit
  InitPluginsDir
    System::Call 'kernel32::CreateMutexA(i 0, i 0, t "autocall_uninstaller") i .r1 ?e'
    Pop $R0
    StrCmp $R0 0 +3
    MessageBox MB_OK|MB_ICONEXCLAMATION "已經有一個AutoCall卸載向導正在運行!  "
    Abort
    MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2  "您確實要完全移除 $(^Name) ,其及所有的組件?   "  /SD IDYES IDNO +7
    execwait "$INSTDIR\NetAssistant.Uninstall.exe" $0
    ${if} $0 == 1
          Abort
    ${elseif} $0 == 2
           goto End1
    ${endif}
  Abort
  End1:
FunctionEnd
Function un.onGUIEnd
FunctionEnd

Function un.onUninstSuccess
  HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地從您的計算機移除。   "
FunctionEnd


#=======================安裝的具體操作======================================================
Section Main
        SetOutPath "$INSTDIR"
        SetOverwrite try
        File /r "files\*.*"
        sleep 5000
SectionEnd
#-----------------------------------------------------------------------------------------#

Section -Addtion
CreateShortCut "$DESKTOP\AutoCall.lnk" "$INSTDIR\AutoCall.exe" "" "" "" "" "" "AutoCall"
CreateDirectory "$SMPROGRAMS\AutoCall"
CreateShortCut "$SMPROGRAMS\AutoCall\AutoCall.lnk" "$INSTDIR\AutoCall.exe"
CreateShortCut "$SMPROGRAMS\AutoCall\AutoCall卸載.lnk" "$INSTDIR\uninst.exe"
GetDlgItem  $0 $HWNDPARENT  1
EnableWindow $0 1
SendMessage $0 ${BM_CLICK} 0 0
sectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd

Section Uninstall
   sleep 1000
   Delete  "$INSTDIR\*.*"
   RMDir  "$INSTDIR"
   Delete "$SMPROGRAMS\AutoCall\AutoCall.lnk"
   Delete "$SMPROGRAMS\AutoCall\AutoCall卸載.lnk"
   RMDir "$SMPROGRAMS\AutoCall"
   Delete "$DESKTOP\AutoCall.lnk"
   SetAutoClose true
SectionEnd


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM