我正在研究NSIS脚本。该脚本主要包含自定义页面。 我使用以下命令添加了目录页面:
!insertmacro MUI_PAGE_DIRECTORY
如何将位图图像添加到已经存在的“浏览...”按钮中,以覆盖默认文本?
答案 0 :(得分:0)
如果您只想使用“打开文件夹图标”,则可以从系统中获取它:
!include WinMessages.nsh
!include LogicLib.nsh
!include nsDialogs.nsh
!include MUI2.nsh
!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_SHOW CustDirShow
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English
!define HIDEBROWSETEXT ; Remove "Browse..." text?
!ifdef HIDEBROWSETEXT
DirText "" "" " "
!endif
!define /ifndef FILE_ATTRIBUTE_DIRECTORY 0x10
!define /ifndef SHGFI_USEFILEATTRIBUTES 0x0010
!define /ifndef SHGFI_ICON 0x0100
!define /ifndef SHGFI_OPENICON 0x0002
!define /ifndef SHGFI_SMALLICON 0x0001
!define /ifndef SHGFI_SYSICONINDEX 0x4000
Var BrowseIcon
Function CustDirShow
${If} $BrowseIcon P= 0 ; Only load the icon once
System::Call '*(p,i,i,&t260,&t80,&l.r1)p.r0'
System::Call 'SHELL32::SHGetFileInfo(t "c:\x", i ${FILE_ATTRIBUTE_DIRECTORY}, pr0, ir1, i ${SHGFI_USEFILEATTRIBUTES}|${SHGFI_ICON}|${SHGFI_SMALLICON}|${SHGFI_OPENICON}|${SHGFI_SYSICONINDEX})'
System::Call '*$0(p.s)'
System::Free $0
Pop $BrowseIcon ; This could also be a HICON from LoadImage etc
${EndIf}
!ifdef HIDEBROWSETEXT
${NSD_AddStyle} $mui.DirectoryPage.BrowseButton ${BS_ICON}
!endif
SendMessage $mui.DirectoryPage.BrowseButton ${BM_SETIMAGE} ${IMAGE_ICON} $BrowseIcon
FunctionEnd
Function .onGUIEnd
System::Call 'USER32::DestroyIcon(p $BrowseIcon)'
FunctionEnd
您也可以将HIDEBROWSETEXT
注释掉以显示文本,但是仅在Vista和更高版本上有效,较早版本的Windows在常规按钮上不支持图像和文本。
可以通过以下方式加载自定义.bmp位图:
...
Var BrowseIcon
Function CustDirShow
${If} $BrowseIcon P= 0 ; Only load the icon once
InitPluginsDir
File "/oname=$PluginsDir\broimg.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
System::Call 'USER32::LoadImage(p0, t "$PluginsDir\broimg.bmp", i ${IMAGE_BITMAP}, i 16, i 16, i ${LR_LOADFROMFILE}|${LR_CREATEDIBSECTION})p.s'
Pop $BrowseIcon
${EndIf}
!ifdef HIDEBROWSETEXT
${NSD_AddStyle} $mui.DirectoryPage.BrowseButton ${BS_BITMAP}
!endif
SendMessage $mui.DirectoryPage.BrowseButton ${BM_SETIMAGE} ${IMAGE_BITMAP} $BrowseIcon
FunctionEnd
Function .onGUIEnd
System::Call 'USER32::DeleteObject(p $BrowseIcon)'
FunctionEnd
但是您失去了透明度等。