NSIS进阶教程(一)

NSIS进阶教程(一)

自定义界面之无边框窗体移动贴图

**前言**

在Windows下,有很多人想做一个完全自己把控的安装程序,想过很多种途径去实现,有人说MFC可以实现,有人说C#可以实现,有人说Delphi可以实现,有人说VB又未尝不可呢。MFC,Delphi,VB,C#都需要自己去实现打包压缩,释放,释放过程中的业务逻辑跟界面功能,是一项比较麻烦的工作,甚至于C#程序需要运行的话,还需要装dotnet Framework的runtime。NSIS制作的安装包可以运行在Win9x下,完全是WinAPI的调用,不需要额外装任何的runtime,安装包双击就能运行,本身封装了很多Win的函数,方便调用与开放接口。功能部分也是实现了基本的安装过程所需的操作,NSIS的很多Editor做到了向导模式的脚本生成,很是方便。

这么好的工具能否定制开发呢,答案是肯定的。

本篇主要讲讲以下几点:

  1. 如何消除普通的NSIS脚本生成的窗体的边框

  2. 如何使得无边框窗体能够移动

  3. 如何给这个窗体贴上一张大小合适的背景图

所用到的NSIS插件:

  • nsDialogs

  • nsWindows

  • WinProc

  • System

**讲义**:

首先贴出一个今天教程的完整的例子(附带图片) 猛击这里

题外话,本来想用新浪爱问做文件分享平台的,发现上传后一直在审核中……练葵花宝典能力谁也比过性浪呀,用CSDN也不好,还要登录,本人就因为积分太少而不得不去做无聊的工作赢得积分,用于CSDN下载,自从CSDN把我的密码明码保存还被黑客给搞了之后,我不再上此网站。115虽然下载页广告多的一笔,但是后台上传页相当的干净,还不用审核以及无登陆下载,极致方便大家。(115被政府搞了,转性浪爱问)

使用时:把插件DLL跟头文件分别放入到你的NSIS本地对应的安装目录中,然后编译源码即可。

下文都用%NSIS_Install_DIR%来替代你本地安装路径

  1. 去除窗体Border

    在去除窗体边框之前有一项工作是必须做的,那就是更改默认窗体的大小,因为每个人想做的打包窗体不可能都一样大,更改窗体大小有两种方法,也可以两种方法并用

    1. 修改NSIS内部的UI

      NSIS的默认UI放在"%NSIS_Install_DIR%\Contrib\UIs"中,其中常常见到的创建自定义窗体的1018,1044都在此路径的modern.exe中。我们只要修改modern.exe里面的资源文件即可,做过MFC的都知道,VC在创建程序的时候是有Resources的,只要找到一些能更改Resources里面Dialog的工具即可,本文推荐ResHacker 。

      修改的时候宁可大点,也绝不小,因为开发过程中我遇到用nsWindows命令扩大窗体的时候,出现不起作用的情况,但是默认窗体比需要的窗体小的时候可以用nsWindows命令控制。

      打开ResHacker工具拖入modern.exe,操作前请备份modern.exe,拖动资源窗体或者直接修改你想要的大小。默认的1044跟1018窗体都在105分类下。

    2. 通过nsWindows命令

      nsDialogs::Create 1044
          Pop $0
          ${If} $0 == error
              Abort
          ${EndIf}
          SetCtlColors $0 ""  transparent ;背景设成透明
                                                                                                              
          ${NSW_SetWindowSize} $HWNDPARENT 513 354 ;改变窗体大小
          ${NSW_SetWindowSize} $0 513 354 ;改变Page大小
      该脚本添加在自定义窗体的创建Function中,创建的是1044类型窗口,修改命令是两条,分别是对$HWNDPARENT的窗体跟创建的1044page的修改,确保默认的modern.exe的窗口大小比这个要大!

    修改好窗体大小后,直接在初始化的Function中直接填入以下代码即可去除边框

    Function onGUIInit
        ;消除边框
        System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`
        ;隐藏一些既有控件
        GetDlgItem $0 $HWNDPARENT 1034
        ShowWindow $0 ${SW_HIDE}
        GetDlgItem $0 $HWNDPARENT 1035
        ShowWindow $0 ${SW_HIDE}
        GetDlgItem $0 $HWNDPARENT 1036
        ShowWindow $0 ${SW_HIDE}
        GetDlgItem $0 $HWNDPARENT 1037
        ShowWindow $0 ${SW_HIDE}
        GetDlgItem $0 $HWNDPARENT 1038
        ShowWindow $0 ${SW_HIDE}
        GetDlgItem $0 $HWNDPARENT 1039
        ShowWindow $0 ${SW_HIDE}
        GetDlgItem $0 $HWNDPARENT 1256
        ShowWindow $0 ${SW_HIDE}
        GetDlgItem $0 $HWNDPARENT 1028
        ShowWindow $0 ${SW_HIDE}
    FunctionEnd

    用System::Call命令调用SetWindowLong的API函数改变GWL_STYLE的样式即可,System是NSIS官方插件用于帮助用户调用系统函数,是相当重要的自动安装程序的插件!程序中其余的代码是把创建的1004页面上其余的控件给隐藏掉,后面携带的ID都是可以通过ResHacker在105包中查询到。

  2. 贴一张大小合适的背景图

    贴图需要用到nsDialogs插件的命令:

    ;贴背景大图
        ${NSD_CreateBitmap} 0 0 100% 100% ""
        Pop $BGImage
        ${NSD_SetImage} $BGImage $PLUGINSDIR\bg.bmp $ImageHandle
                                                                       
        ${NSD_FreeImage} $ImageHandle

    ${NSD_CreateBitmap}命令创建一个跟窗体一样大小的图片区域,后面的五个参数分别是x,y,width,height,text,坐标,宽高,文字。紧接着给这张图贴上一张合适的图片bg.bmp,贴图片之前需要把这个图片打包到安装程序中,这个是基本的操作,源码包中有,这里就不做说明了。最后还要通过${NSD_FreeImage}去释放该图片内存区。

  3. 无标题移动

    做到无标题移动的潜台词是把原本传递给标题栏的Message通过你定义的元素回调传递给标题栏,所以只要给你添加的资源加上传递信息的回调函数就可以了。这里是通过WinProc这个插件完成的,WinProc这个插件在官方的插件库中没有,Google一下就可以查询到,这里的源码包中也有。除了WinProc,第三方插件SkinBtn也可以帮助实现。

    Function onGUICallback
      ${If} $MSG = ${WM_LBUTTONDOWN}
        SendMessage $HWNDPARENT ${WM_NCLBUTTONDOWN} ${HTCAPTION} $0
      ${EndIf}
    FunctionEnd

    以上是回调函数,判断鼠标左键的Down事件,并且传递消息给标题栏。

    GetFunctionAddress $0 onGUICallback
        WndProc::onCallback $BGImage $0 ;处理无边框窗体移动

    以上是把当前的$BGImage作为回调主体,当用户左键点击$BGImage的时候,消息就传递给了窗体标题栏,实现了无边框的移动。

**结束语**

看看结果是什么样子的……哦!kugou也被我山寨了一把,有人精益求精,说,你的程序鼠标放在哪里都能移动,人家kugou只能标题栏移动……是的呀,你把图切成几份,分别贴,有的给回调函数,有的不给就实现了消息部分传递的功能。


有一个注意点:贴图的时候注意了!代码的运行是自上而下,如果要贴的图需要在另一张上面的话,需要把代码写在前面。

比如:

;贴小图
    ${NSD_CreateBitmap} 0 34 100% 100% ""
    Pop $MiddleImage
    ${NSD_SetImage} $MiddleImage $PLUGINSDIR\middle.bmp $ImageHandle
                  
    ;贴背景大图
    ${NSD_CreateBitmap} 0 0 100% 100% ""
    Pop $BGImage
    ${NSD_SetImage} $BGImage $PLUGINSDIR\bg.bmp $ImageHandle

 

That's all

下回继续探讨

***************************

特别感谢石头(石头的qq群号97208217),梦想吧论坛(虽然我还不是个会员,但是学到了很多)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
NSIS(Nullsoft Scriptable Install System)是一款免费且开源的安装制作工具,能够帮助开发者创建Windows安装程序。下面是关于NSIS的图文教程集锦: 1. 下载和安装NSIS:首先需要从NSIS官方网站上下载NSIS安装包,并按照提示完成安装过程。 2. 创建一个NSIS脚本:使用任意文本编辑器创建一个以.nsi为扩展名的文件,这个文件就是NSIS的脚本文件。在脚本文件中可以定义安装程序的界面、文件的安装位置等。 3. 定义安装界面:NSIS提供了丰富的选项和命令来定义安装界面。你可以添加文本、图标、按钮等元素,以及自定义其位置和样式。 4. 添加文件:使用NSIS的File命令将要安装的文件添加进安装程序中。你可以指定文件的来源路径、目标路径等。 5. 设定安装选项:NSIS的配置命令可以帮助你定义一些安装选项,比如安装路径、创建快捷方式、注册表项等。 6. 定义卸载功能:使用Uninstall命令可以创建卸载程序,方便用户在需要时卸载安装的软件。 7. 编译和测试:完成脚本文件后,使用NSIS提供的编译器将脚本文件编译成可执行的安装程序。然后进行测试,确保安装程序的功能和界面都符合预期。 8. 发布安装程序:将编译好的安装程序发布出去,用户可以下载并安装你的软件。 总结:NSIS是一款功能强大的安装制作工具,通过上述简单的图文教程,你可以学会如何使用NSIS创建自定义的Windows安装程序。这些教程将帮助你快速上手NSIS,并使你的软件安装过程更加专业和用户友好。祝你制作出优秀的安装程序!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值