首页 > 解决方案 > 如何在 NSIS 的浏览按钮上放置位图图像?

问题描述

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

!insertmacro MUI_PAGE_DIRECTORY

如何将位图图像添加到将覆盖默认文本的现有“浏览...”按钮?

标签: buttonbitmapnsis

解决方案


如果您只想使用“打开文件夹图标”,您可以从系统中获取它:

!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

但你失去了透明度等。


推荐阅读