如何在NSIS安装程序的欢迎页与完成页中修改图片宽度,用全屏背景图替换左侧横幅
如何在NSIS欢迎页/完成页设置全宽背景图
刚好我之前折腾过NSIS自定义界面,这个需求完全可以实现!下面给你一步步拆解具体做法:
核心思路
NSIS默认的欢迎/完成页左侧是固定宽度的Banner控件,右侧是文本区域。要实现全宽背景,我们需要修改Banner控件的尺寸,让它覆盖整个对话框宽度,再替换成自定义背景图即可。推荐使用Modern UI 2(NSIS自带的增强UI框架)来简化操作。
具体步骤
1. 引入Modern UI 2框架
在你的NSIS脚本开头,先引入Modern UI 2的头文件:
!include MUI2.nsh
2. 为页面绑定预初始化回调函数
我们需要在欢迎页和完成页加载前,调整控件尺寸。在定义页面时,指定自定义的预回调函数:
; 为欢迎页绑定预初始化函数 !define MUI_PAGE_CUSTOMFUNCTION_PRE WelcomePagePre !insertmacro MUI_PAGE_WELCOME ; 为完成页绑定预初始化函数 !define MUI_PAGE_CUSTOMFUNCTION_PRE FinishPagePre !insertmacro MUI_PAGE_FINISH
3. 编写回调函数调整控件并替换图片
接下来实现这两个回调函数,核心操作是找到Banner控件、修改它的尺寸为窗口全宽,再加载自定义背景图:
Function WelcomePagePre ; 获取欢迎页窗口的句柄 FindWindow $0 "#32770" "" $HWNDPARENT ; 获取Banner控件的句柄(使用Modern UI预定义的控件ID) FindControl $1 ${MUI_CONTROL_BANNER} $0 ; 获取窗口客户区的宽度($2是宽度值) GetClientSize $0 $2 $3 ; 调整Banner控件的位置和大小:左上角对齐,宽度铺满窗口,高度保持默认Banner高度 SetWindowPos $1 0 0 0 $2 ${MUI_BANNER_HEIGHT} ${SWP_NOZORDER|SWP_SHOWWINDOW} ; 可选:让图片拉伸填充整个控件(默认是居中显示) ModifyStyle $1 0 ${SS_REALSIZECLIENT} ; 加载自定义欢迎页背景图(替换成你的图片路径) !define MY_WELCOME_BG "welcome_background.bmp" LoadBitmap $4 "${MY_WELCOME_BG}" ; 将图片设置为Banner控件的内容 SendMessage $1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $4 FunctionEnd Function FinishPagePre ; 完成页的操作和欢迎页几乎一致 FindWindow $0 "#32770" "" $HWNDPARENT FindControl $1 ${MUI_CONTROL_BANNER} $0 GetClientSize $0 $2 $3 SetWindowPos $1 0 0 0 $2 ${MUI_BANNER_HEIGHT} ${SWP_NOZORDER|SWP_SHOWWINDOW} ModifyStyle $1 0 ${SS_REALSIZECLIENT} ; 加载自定义完成页背景图 !define MY_FINISH_BG "finish_background.bmp" LoadBitmap $4 "${MY_FINISH_BG}" SendMessage $1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $4 FunctionEnd
4. 额外优化提示
- 图片尺寸适配:NSIS默认窗口宽度是340px,你可以用
!define MUI_WELCOMEPAGE_WIDTH 400(自定义宽度)来调整窗口大小,然后让你的背景图宽度和这个值匹配,避免拉伸变形。 - 文本层显示:如果背景图覆盖了原本的文本,你可以调整文本控件的Z顺序(用
SetWindowPos的SWP_NOZORDER换成SWP_NOOWNERZORDER),或者修改文本的位置和颜色,让它在背景图上更清晰。 - 图片格式:NSIS默认支持BMP格式,如果要用PNG,需要引入
Bitmap插件来加载PNG图片。
内容的提问来源于stack exchange,提问作者אור הושמנד
相关产品推荐
相关产品推荐

