<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nsis.sourceforge.io/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Image_in_installer_window_background</id>
	<title>Image in installer window background - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://nsis.sourceforge.io/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Image_in_installer_window_background"/>
	<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Image_in_installer_window_background&amp;action=history"/>
	<updated>2026-05-17T17:13:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Image_in_installer_window_background&amp;diff=12818&amp;oldid=prev</id>
		<title>Afrow UK at 19:59, 27 July 2007</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Image_in_installer_window_background&amp;diff=12818&amp;oldid=prev"/>
		<updated>2007-07-27T19:59:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{PageAuthor|Afrow UK}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
This NSIS script demonstrates how to display an image in the background of your installer window. It isn&amp;#039;t perfect because we are not using custom drawn controls here.&lt;br /&gt;
&lt;br /&gt;
It uses standard 24-bit BMP format (savable by Microsoft Paint among others). The bitmap image file name in the script shown is called forest.bmp and must be extracted at run-time.&lt;br /&gt;
&lt;br /&gt;
This script differs to other UI hacks because it creates the bitmap static control when the installer is launched. This means you don&amp;#039;t have to make a copy of UIs\modern.exe and mess around with it with Resource Hacker.&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
* The next, back and cancel buttons do not get a transparent background set because they are not owner-drawn. This could be fixed with a pretty basic plug-in to create owner-drawn buttons with custom bitmap images. This is on my TODO list!&lt;br /&gt;
* The components page description box is turned off because for reasons unknown, the text couldn&amp;#039;t be re-painted. InvalidateRect and ShowWindow tricks did not work. If you can sort this out, please let me know.&lt;br /&gt;
&lt;br /&gt;
== The Script ==&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
!include MUI.nsh&lt;br /&gt;
!include WinMessages.nsh&lt;br /&gt;
&lt;br /&gt;
; Local bitmap path.&lt;br /&gt;
!define BITMAP_FILE forest.bmp&lt;br /&gt;
&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
; Installer Settings&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;Background Bitmap&amp;quot;&lt;br /&gt;
OutFile &amp;quot;bgbitmap.exe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
; Modern UI Settings&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
!define MUI_COMPONENTSPAGE_NODESC&lt;br /&gt;
!define MUI_FINISHPAGE_NOAUTOCLOSE&lt;br /&gt;
!define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit&lt;br /&gt;
&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
; Definitions&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
!define LR_LOADFROMFILE     0x0010&lt;br /&gt;
!define LR_CREATEDIBSECTION 0x2000&lt;br /&gt;
!define IMAGE_BITMAP        0&lt;br /&gt;
&lt;br /&gt;
!define SS_BITMAP           0x0000000E&lt;br /&gt;
!define WS_CHILD            0x40000000&lt;br /&gt;
!define WS_VISIBLE          0x10000000&lt;br /&gt;
!define HWND_TOP            0&lt;br /&gt;
!define SWP_NOSIZE          0x0001&lt;br /&gt;
!define SWP_NOMOVE          0x0002&lt;br /&gt;
&lt;br /&gt;
!define IDC_BITMAP          1500&lt;br /&gt;
&lt;br /&gt;
; typedef struct _RECT {&lt;br /&gt;
;   LONG left;&lt;br /&gt;
;   LONG top;&lt;br /&gt;
;   LONG right;&lt;br /&gt;
;   LONG bottom;&lt;br /&gt;
; } RECT, *PRECT;&lt;br /&gt;
!define stRECT &amp;quot;(i, i, i, i) i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Var hBitmap&lt;br /&gt;
&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
; Pages&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePageShow&lt;br /&gt;
!insertmacro MUI_PAGE_WELCOME&lt;br /&gt;
!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicensePageShow&lt;br /&gt;
!insertmacro MUI_PAGE_LICENSE bgbitmap.nsi&lt;br /&gt;
#!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryPageShow&lt;br /&gt;
#!insertmacro MUI_PAGE_DIRECTORY&lt;br /&gt;
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ComponentsPageShow&lt;br /&gt;
!insertmacro MUI_PAGE_COMPONENTS&lt;br /&gt;
!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesPageShow&lt;br /&gt;
!insertmacro MUI_PAGE_INSTFILES&lt;br /&gt;
!define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishPageShow&lt;br /&gt;
!insertmacro MUI_PAGE_FINISH&lt;br /&gt;
&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
; Languages&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
!insertmacro MUI_LANGUAGE English&lt;br /&gt;
&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
; Macros&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
; Destroy a window.&lt;br /&gt;
!macro DestroyWindow HWND IDC&lt;br /&gt;
  GetDlgItem $R0 ${HWND} ${IDC}&lt;br /&gt;
  System::Call `user32::DestroyWindow(i R0)`&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Give window transparent background.&lt;br /&gt;
!macro SetTransparent HWND IDC&lt;br /&gt;
  GetDlgItem $R0 ${HWND} ${IDC}&lt;br /&gt;
  SetCtlColors $R0 0xFFFFFF transparent&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Refresh window.&lt;br /&gt;
!macro RefreshWindow HWND IDC&lt;br /&gt;
  GetDlgItem $R0 ${HWND} ${IDC}&lt;br /&gt;
  ShowWindow $R0 ${SW_HIDE}&lt;br /&gt;
  ShowWindow $R0 ${SW_SHOW}&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
; Functions&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Function MyGUIInit&lt;br /&gt;
&lt;br /&gt;
  ; Extract bitmap image.&lt;br /&gt;
  InitPluginsDir&lt;br /&gt;
  ReserveFile `${BITMAP_FILE}`&lt;br /&gt;
  File `/ONAME=$PLUGINSDIR\bg.bmp` `${BITMAP_FILE}`&lt;br /&gt;
&lt;br /&gt;
  ; Get the size of the window.&lt;br /&gt;
  System::Call `*${stRECT} .R0`&lt;br /&gt;
  System::Call `user32::GetClientRect(i $HWNDPARENT, i R0)`&lt;br /&gt;
  System::Call `*$R0${stRECT} (, , .R1, .R2)`&lt;br /&gt;
  System::Free $R0&lt;br /&gt;
&lt;br /&gt;
  ; Create bitmap control.&lt;br /&gt;
  System::Call `kernel32::GetModuleHandle(i 0) i.R3`&lt;br /&gt;
  System::Call `user32::CreateWindowEx(i 0, t &amp;quot;STATIC&amp;quot;, t &amp;quot;&amp;quot;, 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`&lt;br /&gt;
  System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})`&lt;br /&gt;
&lt;br /&gt;
  ; Set the bitmap.&lt;br /&gt;
  System::Call `user32::LoadImage(i 0, t &amp;quot;$PLUGINSDIR\bg.bmp&amp;quot;, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`&lt;br /&gt;
  Pop $hBitmap&lt;br /&gt;
  SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap&lt;br /&gt;
&lt;br /&gt;
  ; Set transparent backgrounds.&lt;br /&gt;
  !insertmacro SetTransparent $HWNDPARENT 3&lt;br /&gt;
  !insertmacro SetTransparent $HWNDPARENT 1&lt;br /&gt;
  !insertmacro SetTransparent $HWNDPARENT 2&lt;br /&gt;
  !insertmacro SetTransparent $HWNDPARENT 1034&lt;br /&gt;
  !insertmacro SetTransparent $HWNDPARENT 1037&lt;br /&gt;
  !insertmacro SetTransparent $HWNDPARENT 1038&lt;br /&gt;
&lt;br /&gt;
  ; Remove unwanted controls.&lt;br /&gt;
  !insertmacro DestroyWindow  $HWNDPARENT 1256&lt;br /&gt;
  !insertmacro DestroyWindow  $HWNDPARENT 1028&lt;br /&gt;
  !insertmacro DestroyWindow  $HWNDPARENT 1039&lt;br /&gt;
&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; Refresh parent window controls.&lt;br /&gt;
; Has to be done for some controls if they have a&lt;br /&gt;
; transparent background.&lt;br /&gt;
Function RefreshParentControls&lt;br /&gt;
&lt;br /&gt;
  !insertmacro RefreshWindow  $HWNDPARENT 1037&lt;br /&gt;
  !insertmacro RefreshWindow  $HWNDPARENT 1038&lt;br /&gt;
&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; For welcome page.&lt;br /&gt;
Function WelcomePageShow&lt;br /&gt;
&lt;br /&gt;
  ; Set transparent backgrounds.&lt;br /&gt;
  SetCtlColors $MUI_HWND 0xFFFFFF transparent&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1200&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1201&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1202&lt;br /&gt;
&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; For license page.&lt;br /&gt;
Function LicensePageShow&lt;br /&gt;
&lt;br /&gt;
  ; Set transparent backgrounds.&lt;br /&gt;
  FindWindow $MUI_HWND &amp;quot;#32770&amp;quot; &amp;quot;&amp;quot; $HWNDPARENT&lt;br /&gt;
  SetCtlColors $MUI_HWND 0xFFFFFF transparent&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1040&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1000&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1006&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1034&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1035&lt;br /&gt;
&lt;br /&gt;
  ; Refresh controls.&lt;br /&gt;
  Call RefreshParentControls&lt;br /&gt;
&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; For directory page.&lt;br /&gt;
Function DirectoryPageShow&lt;br /&gt;
&lt;br /&gt;
  ; Set transparent backgrounds.&lt;br /&gt;
  FindWindow $MUI_HWND &amp;quot;#32770&amp;quot; &amp;quot;&amp;quot; $HWNDPARENT&lt;br /&gt;
  SetCtlColors $MUI_HWND 0xFFFFFF transparent&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1019&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1001&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1024&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1008&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1023&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1006&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1020&lt;br /&gt;
&lt;br /&gt;
  ; Remove group box text. $R0 still contains HWND of 1020 :)&lt;br /&gt;
  SendMessage $R0 ${WM_SETTEXT} 0 STR:&lt;br /&gt;
&lt;br /&gt;
  ; Refresh controls.&lt;br /&gt;
  Call RefreshParentControls&lt;br /&gt;
&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; For components page.&lt;br /&gt;
Function ComponentsPageShow&lt;br /&gt;
&lt;br /&gt;
  ; Set transparent backgrounds.&lt;br /&gt;
  FindWindow $MUI_HWND &amp;quot;#32770&amp;quot; &amp;quot;&amp;quot; $HWNDPARENT&lt;br /&gt;
  SetCtlColors $MUI_HWND 0xFFFFFF transparent&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1017&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1022&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1021&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1023&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1006&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1032&lt;br /&gt;
&lt;br /&gt;
  ; Refresh controls.&lt;br /&gt;
  Call RefreshParentControls&lt;br /&gt;
&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; For instfiles page.&lt;br /&gt;
Function InstFilesPageShow&lt;br /&gt;
&lt;br /&gt;
  ; Set transparent backgrounds.&lt;br /&gt;
  FindWindow $MUI_HWND &amp;quot;#32770&amp;quot; &amp;quot;&amp;quot; $HWNDPARENT&lt;br /&gt;
  SetCtlColors $MUI_HWND 0xFFFFFF transparent&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1027&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1004&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1006&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1016&lt;br /&gt;
&lt;br /&gt;
  ; Refresh controls.&lt;br /&gt;
  Call RefreshParentControls&lt;br /&gt;
&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; For finish page.&lt;br /&gt;
Function FinishPageShow&lt;br /&gt;
&lt;br /&gt;
  ; Set transparent backgrounds.&lt;br /&gt;
  SetCtlColors $MUI_HWND 0xFFFFFF transparent&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1200&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1201&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1202&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1203&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1204&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1205&lt;br /&gt;
  !insertmacro SetTransparent $MUI_HWND 1206&lt;br /&gt;
&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; Free loaded resources.&lt;br /&gt;
Function .onGUIEnd&lt;br /&gt;
&lt;br /&gt;
  ; Destroy the bitmap.&lt;br /&gt;
  System::Call `gdi32::DeleteObject(i s)` $hBitmap&lt;br /&gt;
&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
; Dummy section&lt;br /&gt;
; --------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Section &amp;quot;Dummy Section&amp;quot;&lt;br /&gt;
SectionEnd&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Code_Examples]]&lt;/div&gt;</summary>
		<author><name>Afrow UK</name></author>
	</entry>
</feed>