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)