按钮设置皮肤插件SkinBtn

1. 必须先在.onInit或.onGUIInit函数使用SkinBtn::Init初始化插件
SkinBtn::Init 可带一个参数,用于指定按钮缺省使用的皮肤
用法示例:

Function .onInit
 InitPluginsDir
 File /oname=$PLUGINSDIRbutton.bmp button.bmp
 SkinBtn::Init "$PLUGINSDIRbutton.bmp"
 FunctionEnd

2. 使用SkinBtn::Set给指定按钮应用皮肤:
SkinBtn::Set [/IMGID=皮肤位图] 按钮句柄
/IMGID=皮肤位图 为可选项,若不指定,则使用SkinBtn::Init所指定的皮肤位图
皮肤位图可以指定为#位图资源ID(可使用!packhdr和ResHacker添加位图资源)
当然,也可以指定为位图文件的完整路径,例如:
SkinBtn::Set /IMGID=$PLUGINSDIRbutton.bmp $0
按钮文字颜色可用SetCtlColors更改
用法示例:

Function .onGUIInit
 ${For} $1 1 3
 GetDlgItem $0 $HWNDPARENT $1
 SetCtlColors $0 0x0C4E7C transparent
 SkinBtn::Set $0
 ${Next}
 FunctionEnd

3. 使用SkinBtn::onClick给按钮添加点击事件
SkinBtn::onClick 按钮句柄 回调函数地址
使用 GetFunctionAddress 获取期望的回调函数地址。
示例
例子详见:ExamplesSkinBtn.nsi

SetCompressor lzma
 !ifdef NSIS_UNICODE
 !define SKINBTNDIR "..PluginsUnicode"
 !else
 !define SKINBTNDIR "..Plugins"
 !endif
 !addplugindir "${SKINBTNDIR}"
 !Include "MUI.nsh"
 !define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
 ;!insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "${__FILE__}"
 !define MUI_PAGE_CUSTOMFUNCTION_SHOW DirPageShow
 !insertmacro MUI_PAGE_DIRECTORY
 !define MUI_PAGE_CUSTOMFUNCTION_SHOW InstPageShow
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_LANGUAGE "SimpChinese"
 Name "SkinBtn"
 OutFile "SkinBtn.exe"
 Caption "NSIS按钮皮肤插件"
 InstallDir "$PROGRAMFILESNSIS"
 LicenseForceSelection checkbox
 Section
 SectionEnd
 Function .onInit
 InitPluginsDir
 File /oname=$PLUGINSDIRbutton1.bmp button1.bmp
 File /oname=$PLUGINSDIRbutton2.bmp button2.bmp
 SkinBtn::Init "$PLUGINSDIRbutton1.bmp"
 FunctionEnd
 Function onGUIInit
 ${For} $1 1 3
 GetDlgItem $0 $HWNDPARENT $1
 SetCtlColors $0 0x0C4E7C transparent
 SkinBtn::Set $0
 ${Next}
 FunctionEnd
 Function onBack
 MessageBox MB_ICONINFORMATION|MB_YESNO "你确实要返回前一个页面吗?" IDYES +2
 Abort
 SkinBtn::onClick $R0 0 ;取消对上一步按钮点击事件的处理
 FunctionEnd
 Function SkinBtn
 FindWindow $0 "#32770" "" $HWNDPARENT
 GetDlgItem $0 $0 $1
 SkinBtn::Set /IMGID=$PLUGINSDIRbutton2.bmp $0
 FunctionEnd
 Function DirPageShow
 StrCpy $1 1001
 Call SkinBtn
 GetDlgItem $R0 $HWNDPARENT 3
 GetFunctionAddress $0 onBack
 SkinBtn::onClick $R0 $0
 FunctionEnd
 Function InstPageShow
 StrCpy $1 1027
 Call SkinBtn
 FunctionEnd

备注
皮肤位图要求说明:
位图必须包含5种状态图像:Normal、MouseOver、Pushed、Disabled、Focus
位图宽度和高度都没限制,但最好要适合按钮大小,并且高度必须是5的倍数
按钮贴图是用系统API函数TransparentBlt实现的,透明色为粉色(0xFF00FF)

THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容