杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2936|回复: 0

NSIS 图形界面(使用nsiskin插件)进阶教程

[复制链接]
发表于 2017-12-22 17:26:54 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
写在系列教程的最开头,感谢烂菜大牛,他写了个系列教程(NSIS进阶教程)是本系列教程的基础
本系列教程和烂菜大牛的系列教程异同如下:
1.本教程使用的图片资源来源于烂菜大牛的教程
2.插件使用,本系列教程只使用nsiskin一个插件,而烂菜大牛使用了nswindows,wndproc,skinbtn,skinprogress等插件
3.复选框(checkbox),本教程直接实现复选框,烂菜大牛的教程用的是skinbtn+label来模拟复选框
烂菜大牛的教程写的真的很好,推荐大家看本教程之前先百度搜索看一下烂菜大牛的教程,相比之下,我还是新手,如有错误,大家多批评指正
在开始之前,我们来看一下nsiskin插件能做出什么样的效果
1.gif
好了,参照烂菜大牛教程的形式,我们开始吧
教程第一步,我们来看看如何实现无边框窗口及移动,并贴上一张背景图
再使用nsiskin插件之前,首先要初始化插件,代码如下
GetFunctionAddress $R0 onImageCallback
    GetFunctionAddress $R1 onButtonClick
    nsiskin::Init /NOUNLOAD $R0 $R1 34
onImageCallback,图片回调函数,返回绘图所需要的图片
返回的图片由如下代码创建
nsiskin:oadImg /NOUNLOAD "$PLUGINSDIR\bg.bmp"
    Pop $BGImage
onButtonClick,按钮按下回掉函数,当按钮被按下,通过此回调函数通知脚本
有了以上知识作基础,我们来看一下欢迎页面的关键代码

  1. Function WelcomePage
  2.     nsDialogs::Create 1044
  3.     Pop $Dialog
  4.     ${If} $Dialog == error
  5.         Abort
  6.     ${EndIf}
  7.     SetCtlColors $Dialog ""  transparent ;背景设成透明
  8.     ${SetWindowSize} $HWNDPARENT 513 354 ;改变窗体大小
  9.     ${SetWindowSize} $Dialog 513 354 ;改变Page大小
  10.    
  11.    
  12.     ${NSD_CreateBitmap} 0 34 100% 100% ""
  13.     Pop $0
  14.     ${NSD_SetImage} $0 $PLUGINSDIR\middle.bmp $1
  15.      
  16.     nsiskin::Attach /NOUNLOAD $Dialog
  17.    
  18.     nsDialogs::Show
  19.     ${NSD_FreeImage} $1
  20. FunctionEnd
复制代码



其中,最重要的是nsiskin:: Attach函数,此函数接管窗口,完成无边框窗口移动,图片绘制等一系列功能

此时,两个回调函数状态如下
  1. Function onImageCallback
  2.     Pop $0
  3.     ${If} $0 = $Dialog
  4.         push $BGImage
  5.     ${EndIf}
  6. FunctionEnd

  7. Function onButtonClick
  8. FunctionEnd
复制代码



第一步就完成了,我们来看看效果先

22222.jpg

第二步,实现图形按钮,button和checkbox
按钮由如下代码创建
nsiskin::CreateButton /NOUNLOAD $Dialog 330 315 88 25 "install"
其中dialog为按钮父窗口,330 315 88 25 组成按钮位置坐标,最后一个参数为按钮window text,可以为空
再来看看如何创建checkbox
nsiskin::CreateButton /NOUNLOAD $Dialog 26 180 150 15 "i agree"
    Pop $AgreeBtn
    StrCpy $BoolAgree 1
    SendMessage $AgreeBtn ${WM_SETFONT} $Font 0
点击checkbox会回调
  1. Function onButtonClick
  2.     Pop $0
  3.     ${If} $0 = $NextBtn
  4.           call onClickNext
  5.     ${ElseIf} $0 = $AgreeBtn
  6.           call onClickAgree
  7.     ${ElseIf} $0 = $Agree1Btn
  8.           call onClickAgree1
  9.     ${EndIf}
  10. FunctionEnd

  11. Function onClickAgree
  12.     ${If} $BoolAgree == '1'
  13.         StrCpy $BoolAgree 0
  14.     ${Else}
  15.         StrCpy $BoolAgree 1
  16.     ${EndIf}
  17. FunctionEnd
复制代码



点击I agree这个checkbox后,插件会回调onClickAgree,由这个函数完成状态切换
checkbox的图片切换由如下函数完成
  1. Function onImageCallback
  2.     Pop $0
  3.     ${If} $0 = $Dialog
  4.         push $BGImage
  5.     ${ElseIf} $0 = $CloseBtn
  6.         push $CloseImg
  7.     ${ElseIf} $0 = $NextBtn
  8.         push $NextImg
  9.     ${ElseIf} $0 = $InstallBtn
  10.         push $NextImg
  11.     ${ElseIf} $0 = $PathEdt
  12.         push $EditImg
  13.     ${ElseIf} $0 = $PathBtn
  14.         push $ChangeImg
  15.         
  16.     ${ElseIf} $0 = $AgreeBtn
  17.         push '5'
  18.         ${If} $BoolAgree == '1'
  19.               push $CheckImg2
  20.         ${Else}
  21.                push $CheckImg1
  22.         ${EndIf}
  23.     ${ElseIf} $0 = $Agree1Btn
  24.         push '5'
  25.         ${If} $BoolAgree1 == '1'
  26.               push $CheckImg2
  27.         ${Else}
  28.                push $CheckImg1
  29.         ${EndIf}
  30.         
  31.     ${EndIf}
  32. FunctionEnd
复制代码




至此,我们已经完成了button和checkbox的创建,checkbox并且可以根据不同的状态显示不同的图片,我们来看看效果
3333333.jpg

第三步,实现提示框messagebox
当用户点击关闭按钮时,需要弹出一个msgbox用户提示用户,让用户确认其确实要退出安装程序
msgbox创建代码如下

  1. Function onClose
  2.     nsiskin::CreateWindow /NOUNLOAD $HWNDPARENT 0 0 349 184 "提示"
  3.     pop $MsgBox
  4.    
  5.     nsiskin::CreateButton /NOUNLOAD $MsgBox 325 8 15 15 "" 2
  6.     Pop $Close1Btn
  7.     ;System::Call 'User32::CreateWindowEx(i0,t"STATIC", i0, i0x5000000d,i50,i50,i40,i40,i$MsgBox,i1130,i0,i0)i.R1'
  8.     System::Call 'User32::CreateWindowEx(i0,t"STATIC", t"quit confirm?", i0x5000000d,i120,i60,i100,i17,i$MsgBox,i1130,i0,i0)i.R1'
  9.     nsiskin::CreateButton /NOUNLOAD $MsgBox 100 120 88 25 "yes" 1
  10.     pop $QuitBtn
  11.     nsiskin::CreateButton /NOUNLOAD $MsgBox 200 120 88 25 "no" 2
  12.     pop $CancelBtn
  13.     EnableWindow $HWNDPARENT 0
  14.     ShowWindow $MsgBox ${SW_SHOW}
  15.     Abort
  16. FunctionEnd
复制代码



其中,nsiskin::CreateWindow为关键代码,此函数创建一个window并返回其句柄,默认居中
以此window为父窗口创建button,并指定其id为1和2,那么就相当于确认和取消,window会自动处理相关事件
到这里我们就完成了图形msgbox的创建并显示,来看看效果吧
444444.jpg

第四步,实现图形进度条
安装程序释放复制文件的时候,需要一个进度条来提示用户安装进度,接下来我们看看这个进度条如何实现
  1. strcpy $Percent 0
  2.     GetFunctionAddress $0 NSD_TimerFun
  3.     nsDialogs::CreateTimer $0 500
  4.     nsiskin::CreateButton /NOUNLOAD $Dialog 490 8 15 15 ""
  5.     Pop $CloseBtn
  6.     ${NSD_CreateLabel} 24 243 474 5 "Progress"
  7.     Pop $Progress
  8.     ;SetCtlColors $Progress ""  transparent ;背景设成透明
  9.     ${NSD_AddStyle} $Progress ${SS_OWNERDRAW}
复制代码


以上代码创建了一个模拟进度条,并通过timer来更新进度(可以通过设置实际进度来控制进度条,演示用timer)

  1. Function NSD_TimerFun
  2.     ${If} $Percent != 100
  3.           IntOp $Percent $Percent + 10
  4.           System::Call 'User32::InvalidateRect(i$Progress, i0, i1)i.R9'
  5.     ${Else}
  6.            GetFunctionAddress $0 NSD_TimerFun
  7.            nsDialogs::KillTimer $0
  8.     ${EndIf}
  9. FunctionEnd
复制代码


以上是timer的回调函数,从此函数我们可以看出,完成进度设置和进度条刷新都由此函数完成

到这里界面部分基本完成了,我们来看看有了进度条的效果吧
5555555555.jpg
第五步,实现页面之间的跳转和完成页面并退出安装程序
页面之间的跳转由如下函数完成
  1. Function RelGotoPage
  2.   IntCmp $R9 0 0 Move Move
  3.     StrCmp $R9 "X" 0 Move
  4.       StrCpy $R9 "120"
  5.   Move:
  6.   SendMessage $HWNDPARENT "0x408" "$R9" ""
  7. FunctionEnd
  8. Function onClickNext
  9.   StrCpy $R9 1
  10.   Call RelGotoPage
  11.   Abort
  12. FunctionEnd
复制代码


不要问我为什么,因为我也没有研究,直接从烂菜大牛的代码中拿来的
同样的,让我们来看看最终的效果吧
6666666666.jpg

至此,我们已经完成了nsiskin插件的使用介绍,通过使用此插件,安装包制作者已经可以制作出一个精美的安装包了,
如果在使用此插件的过程中遇到了什么问题,欢迎来群 37586365 交流讨论
nsiskin更详细的使用教程,请从群共享文件中获取

ps:脚本需要Unicode版nsis编译,推荐2.46.5版本


nsiskin.zip (519.69 KB, 下载次数: 0)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-3-29 04:12 , Processed in 0.124536 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表