You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为NSIS的MUI_PAGE_INSTFILES页面添加背景图片

为NSIS的MUI_PAGE_INSTFILES页面添加全屏静态背景

实现步骤

  1. 引入必要头文件:添加窗口消息、通用控件和nsDialogs相关的include,用于控件操作与消息处理。
  2. 绑定MUI页面自定义函数:通过MUI_CUSTOMFUNCTION_INSTFILESPRE和MUI_CUSTOMFUNCTION_INSTFILESPOST指定安装文件页面显示前后的处理逻辑。
  3. 编写前置处理逻辑:隐藏原有冗余控件、加载背景图片并创建全屏静态控件、调整控件层级、设置进度条和文件列表的背景透明。
  4. 编写后置清理逻辑:释放加载的位图资源,避免内存泄漏。

修改后的完整代码

; DIMM_V2 Easy NSIS GUI Script 
!include MUI2.nsh
!include WinMessages.nsh
!include CommCtrl.nsh
!include nsDialogs.nsh

; 定义MUI安装文件页面的前置/后置自定义函数
!define MUI_CUSTOMFUNCTION_GUIINIT dimm_hide
!define MUI_CUSTOMFUNCTION_INSTFILESPRE InstFilesPre
!define MUI_CUSTOMFUNCTION_INSTFILESPOST InstFilesPost

!include "page1.nsdinc"
!include "page2.nsdinc"
!include "page3.nsdinc"

!define MUI_HEADERIMAGE #  need to load custom exe 
!define MUI_UI_HEADERIMAGE ".\dimm_beta_img.exe"  ; dimm 1018 my bmp image ! 
; !define MUI_UI_HEADERIMAGE ".\modern.exe"  ; dimm 1018 my bmp image ! 

; dimm code for switching pages is is inside of pages .nsdinc

Page custom fnc_page1_Show
Page custom fnc_page2_Show
Page custom fnc_page3_Show
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

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

; 106 this page is Details Page
Function dimm_hide
; dimm   hide   ; need to hide 1256  /// 1037
!insertmacro DestroyWindow  $HWNDPARENT 1045     # dimm remove line from bottom
!insertmacro DestroyWindow  $HWNDPARENT 1256     # dimm remove line from bottom
!insertmacro DestroyWindow  $HWNDPARENT 1037     # dimm remove line from bottom
!insertmacro DestroyWindow  $HWNDPARENT 1028     # dimm remove line from bottom
FunctionEnd

; 安装文件页面前置处理:设置背景图片
Function InstFilesPre
    ; 隐藏原有多余控件,保持和自定义页面一致的风格
    !insertmacro DestroyWindow $HWNDPARENT 1045
    !insertmacro DestroyWindow $HWNDPARENT 1256
    !insertmacro DestroyWindow $HWNDPARENT 1037
    !insertmacro DestroyWindow $HWNDPARENT 1028

    ; 获取安装页面客户区的宽高
    System::Call 'user32::GetClientRect(i $HWNDPARENT, i r0, i r1, i r2, i r3)'
    IntOp $2 $2 - $0 ; 计算宽度
    IntOp $3 $3 - $1 ; 计算高度

    ; 创建全屏静态图片控件
    nsDialogs::CreateControl /NOUNLOAD STATIC ${WS_CHILD}|${WS_VISIBLE}|${SS_BITMAP} 0u 0u ${NSD_SIZE} ${NSD_SIZE} ""
    Pop $R0

    ; 加载背景位图(替换为你的背景图片路径,建议用BMP格式)
    System::Call 'user32::LoadImage(i 0, t "dimm_instfiles_bg.bmp", i ${IMAGE_BITMAP}, i $2, i $3, i ${LR_LOADFROMFILE})i.r1'
    SendMessage $R0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $1

    ; 将图片控件置于最底层,确保其他控件显示在上方
    System::Call 'user32::SetWindowPos(i $R0, i ${HWND_BOTTOM}, i 0, i 0, i $2, i $3, i ${SWP_NOMOVE}|${SWP_NOSIZE})'

    ; 处理进度条背景透明
    GetDlgItem $R1 $HWNDPARENT 1004 ; 进度条控件ID
    SendMessage $R1 ${PBM_SETBKCOLOR} 0 ${CLR_NONE}

    ; 处理文件列表控件的背景透明与文字颜色
    GetDlgItem $R2 $HWNDPARENT 1016 ; 文件列表控件ID
    SendMessage $R2 ${LVM_SETBKCOLOR} 0 ${CLR_NONE}
    SendMessage $R2 ${WM_SETTEXTCOLOR} 0 0xFFFFFF ; 白色文字,可根据背景调整
    SetWindowLong $R2 ${GWL_EXSTYLE} ${WS_EX_TRANSPARENT}
FunctionEnd

; 安装文件页面后置处理:清理资源
Function InstFilesPost
    ; 释放加载的位图资源
    System::Call 'user32::DeleteObject(i $1)'
FunctionEnd

Section
SectionEnd

关键说明

  • 背景图片路径:请将代码中的"dimm_instfiles_bg.bmp"替换为你实际的背景图片路径,建议使用BMP格式,若使用其他格式需额外处理。
  • 控件ID:代码中使用的进度条ID(1004)和文件列表ID(1016)是MUI_INSTFILES页面的默认控件ID,若你的MUI版本有差异可通过Spy++工具确认。
  • 文字颜色:0xFFFFFF是白色,可根据你的背景图片调整为合适的文字颜色,确保可读性。

内容的提问来源于stack exchange,提问作者DIMM_V2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:20:00