button - 如何在 NSIS 的浏览按钮上放置位图图像?
问题描述
我正在编写 NSIS 脚本。该脚本主要包含自定义页面。我使用以下命令添加了一个目录页面:
!insertmacro MUI_PAGE_DIRECTORY
如何将位图图像添加到将覆盖默认文本的现有“浏览...”按钮?
解决方案
如果您只想使用“打开文件夹图标”,您可以从系统中获取它:
!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
但你失去了透明度等。
推荐阅读
- acumatica - 具有多个连接和 where 子句的 Search2
- python - Python读取“”内带有字符串的列
- command-line-interface - 如何将 Windows SMB(服务器消息块)共享从网络设备自动挂载到您的 linux 计算机
- javascript - 在添加行时阻止表行被添加到每一行
- javascript - 以合理的文件名保存 SVG 中包含的 BMP
- gitlab - jq - 如何将数组转换为 .gitlab-ci.yml 文件中以逗号分隔的字符串列表
- azure - 如何为 Azure 可用性集中的虚拟机数量创建 Terraform for_each 循环
- python - 如何告诉 cmake 使用哪个版本的 python?
- kubernetes - 我们可以使用服务“kubernetes”与 API 服务器通信吗?
- python - Boto3:从 S3 下载文件