3

I'm creating a setup.exe to my application and I'm using the nsis setup creator and I am compiling on ubuntu.

Now I want customize the setup to appear with background image like this:

nsis setup

How can I put a background in my setup with nsis?

Jorge B.
  • 1,144
  • 2
  • 17
  • 37

4 Answers4

3

A clue would be, editing the required UI executable using Resource hacker and add a picture control on top of it.

You can find the available UI modules inside system path: C:\Program Files\NSIS\Contrib\UIs.

Then once you are done with your editing, define the custom UI using !define MUI_UI in your script and process accordingly.

hypheni
  • 756
  • 3
  • 17
  • 37
3

Your picture is actually this one: http://www.graphical-installer.com/joomla/images/stories/gallery/projects/gallery-4.jpg

So you can use that software - Graphical Installer for NSIS - to achieve exactly the same effect without any effort or programming :)

As author of that software I can say it is really easy to achieve such design:

  1. Add custom control on installer UI (using ResHacker) - the better is to create new UI file so your previous installer will not be corrupted
  2. Load image from file into control - use WinAPI calls or some NSIS wrapper. Keep in mind the picture path must be somewhere on end-user's computer, e.g. $Temp.

(the same as hypheni said but with more details)

Slappy
  • 5,250
  • 1
  • 23
  • 29
2

For more details please refer to the below code snippet

Var hBitmap
!define MUI_CUSTOMFUNCTION_GUIINIT CustomGUIInit

Function CustomGUIInit
    InitPluginsDir
    ReserveFile `${BMP_HEAD}`
    File `/ONAME=$PLUGINSDIR\head.bmp` `${BMP_HEAD}`

    GetDlgItem $R1 $HWNDPARENT 1034
    System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\head.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s`
    Pop $hBitmap
    SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap
FunctionEnd

The above code is calling LoadImage Win32 API function from user32.dll and sets to windows control by SendMessage call.

hypheni
  • 756
  • 3
  • 17
  • 37
  • @JorgeB.: You wil have to check 'GetDlgItem $R1 $HWNDPARENT 1034', Image paths. – hypheni May 20 '15 at 14:08
  • what do you mean? I am new at this and I'm struggling to see the logic of that – Jorge B. May 20 '15 at 15:15
  • 1
    You need to understand LoadImage, SendMessage API of windows. Otherwise you won't be able to understand the above code. Its better to start off with Google and MSDN. – hypheni May 20 '15 at 16:54
0

add yourimage : res.bmp near to script.

!include "MUI2.nsh"

; Local bitmap path.
!define BITMAP_FILE res.bmp

; --------------------------------------------------------------------------------------------------
; Installer Settings
; --------------------------------------------------------------------------------------------------
Name "Background Bitmap"
OutFile "bgbitmap.exe"
ShowInstDetails show
!define MUI_HEADERIMAGE # this is responsible for the big window
;!define MUI_UI_HEADERIMAGE ".\dimm_beta_img.exe" # modded exe
; --------------------------------------------------------------------------------------------------
; Modern UI Settings
; --------------------------------------------------------------------------------------------------
!define MUI_COMPONENTSPAGE_NODESC
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit

; --------------------------------------------------------------------------------------------------
; Definitions
; --------------------------------------------------------------------------------------------------

Var hBitmap

; --------------------------------------------------------------------------------------------------
; Pages
; --------------------------------------------------------------------------------------------------
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePageShow
!insertmacro MUI_PAGE_WELCOME

!insertmacro MUI_LANGUAGE English

; --------------------------------------------------------------------------------------------------
; Macros
; --------------------------------------------------------------------------------------------------
; Destroy a window.
!macro DestroyWindow HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
System::Call `user32::DestroyWindow(i R0)`
!macroend

; Give window transparent background.
!macro SetTransparent HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
SetCtlColors $R0 0x444444 transparent
!macroend

; Refresh window.
!macro RefreshWindow HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
ShowWindow $R0 ${SW_HIDE}
ShowWindow $R0 ${SW_SHOW}
!macroend

; --------------------------------------------------------------------------------------------------
; Functions
; --------------------------------------------------------------------------------------------------
Function MyGUIInit
; Extract bitmap image.
InitPluginsDir
ReserveFile `${BITMAP_FILE}`
File `/ONAME=$PLUGINSDIR\res.bmp` `${BITMAP_FILE}`
; Get the size of the window.
System::Call `*${stRECT} .R0`
System::Call `user32::GetClientRect(i $HWNDPARENT, i R0)`
System::Call `*$R0${stRECT} (, , .R1, .R2)`
System::Free $R0
; Create bitmap control.
System::Call `kernel32::GetModuleHandle(i 0) i.R3`
System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i 0, i 0, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R1`
System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})`
; Set the bitmap.
System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\res.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $hBitmap
SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap
; Set transparent backgrounds.
!insertmacro SetTransparent $HWNDPARENT 3
!insertmacro SetTransparent $HWNDPARENT 1
!insertmacro SetTransparent $HWNDPARENT 2
!insertmacro SetTransparent $HWNDPARENT 1034
!insertmacro SetTransparent $HWNDPARENT 1037
!insertmacro SetTransparent $HWNDPARENT 1038
!insertmacro SetTransparent $HWNDPARENT 1028
!insertmacro SetTransparent $HWNDPARENT 1256
; !insertmacro SetTransparent $HWNDPARENT 1045
!insertmacro SetTransparent $HWNDPARENT 1035
; Remove unwanted controls.
!insertmacro DestroyWindow $HWNDPARENT 1256
!insertmacro DestroyWindow $HWNDPARENT 1028
; !insertmacro DestroyWindow $HWNDPARENT 1039
!insertmacro DestroyWindow $HWNDPARENT 1045 # dimm remove line from bottom
; !insertmacro DestroyWindow $HWNDPARENT 1035
; !insertmacro DestroyWindow $HWNDPARENT 1256
FunctionEnd

Function RefreshParentControls
!insertmacro RefreshWindow $HWNDPARENT 1037
!insertmacro RefreshWindow $HWNDPARENT 1038
FunctionEnd

Function WelcomePageShow
# Sets background image
System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\res.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $hBitmap
; SendMessage $bitmapWindow ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap
# Start solution
SetCtlColors $mui.WelcomePage ${CTRL_COLOUR} transparent
SetCtlColors $mui.WelcomePage.text ${CTRL_COLOUR} transparent
SetCtlColors $mui.WelcomePage.title 0x333333 transparent
!insertmacro DestroyWindow $HWNDPARENT 1037
!insertmacro DestroyWindow $HWNDPARENT 1038
!insertmacro DestroyWindow $HWNDPARENT 1036
SetCtlColors $0 222425 transparent
System::Call `user32::DestroyWindow(i $mui.WelcomePage.Image)`

Call RefreshParentControls
FunctionEnd
; BrandingText ""

; Free loaded resources.
Function .onGUIEnd
; Destroy the bitmap.
System::Call `gdi32::DeleteObject(i s)` $hBitmap
FunctionEnd

; --------------------------------------------------------------------------------------------------
; Dummy section
; --------------------------------------------------------------------------------------------------
Section "Dummy Section"
SectionEnd
DIMM_V2
  • 105
  • 1
  • 9