如何在NSIS中的浏览按钮上放置位图图像?

时间:2018-08-07 12:11:20

标签: button bitmap nsis

我正在研究NSIS脚本。该脚本主要包含自定义页面。 我使用以下命令添加了目录页面:

!insertmacro MUI_PAGE_DIRECTORY

如何将位图图像添加到已经存在的“浏览...”按钮中,以覆盖默认文本?

1 个答案:

答案 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

但是您失去了透明度等。