首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将位图图像放在NSIS中的浏览按钮上?

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

Stack Overflow用户
提问于 2018-08-07 20:11:20
回答 1查看 148关注 0票数 0

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

代码语言:javascript
复制
!insertmacro MUI_PAGE_DIRECTORY

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

EN

回答 1

Stack Overflow用户

发布于 2018-08-08 05:07:23

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

代码语言:javascript
复制
!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,旧版本的Windows不支持普通按钮上的image+text。

加载自定义.bmp位图的过程如下所示:

代码语言:javascript
复制
...

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

但是你会失去透明度等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51726498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档