设为首页 |收藏本站 |切换到宽版
 找回密码

NSIS中文论坛

查看: 6519|回复: 10
收起左侧

[教程] [烂菜]自定义页面教程[酷狗]一

[复制链接]
  • TA的每日心情
    郁闷
    7 天前
  • 签到天数: 147 天

    [LV.7]常住居民III

    29

    主题

    191

    帖子

    1万

    积分

    积分
    13622
    发表于 2015-7-14 21:25:52 | 显示全部楼层 |阅读模式
    本帖最后由 mefcl 于 2015-7-14 21:50 编辑

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

    本文是转载烂菜同学的教程,算是丰富下论坛吧。老鸟就不用看了。
    原地址:hamletsoft.com

    **前言**

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

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

    本篇主要讲讲以下几点:

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

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

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

    所用到的NSIS插件:

    nsDialogs

    nsWindows

    WinProc

    System

    **讲义**:

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

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

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

    1:去除窗体Border

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

    a.修改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分类下。

    lancai_01.png
    lancai_02.png

    b.通过nsWindows命令

    代码

    1. nsDialogs::Create 1044
    2. Pop $0
    3. ${If} $0 == error
    4.     Abort
    5. ${EndIf}
    6. SetCtlColors $0 ""  transparent ;背景设成透明
    7. ${NSW_SetWindowSize} $HWNDPARENT 513 354 ;改变窗体大小
    8. ${NSW_SetWindowSize} $0 513 354 ;改变Page大小
    复制代码
    该脚本添加在自定义窗体的创建Function中,创建的是1044类型窗口,修改命令是两条,分别是对$HWNDPARENT的窗体跟创建的1044page的修改,确保默认的modern.exe的窗口大小比这个要大! 修改好窗体大小后,直接在初始化的Function中直接填入以下代码即可去除边框
    1. Function onGUIInit
    2.     ;消除边框
    3.     System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`
    4.     ;隐藏一些既有控件
    5.     GetDlgItem $0 $HWNDPARENT 1034
    6.     ShowWindow $0 ${SW_HIDE}
    7.     GetDlgItem $0 $HWNDPARENT 1035
    8.     ShowWindow $0 ${SW_HIDE}
    9.     GetDlgItem $0 $HWNDPARENT 1036
    10.     ShowWindow $0 ${SW_HIDE}
    11.     GetDlgItem $0 $HWNDPARENT 1037
    12.     ShowWindow $0 ${SW_HIDE}
    13.     GetDlgItem $0 $HWNDPARENT 1038
    14.     ShowWindow $0 ${SW_HIDE}
    15.     GetDlgItem $0 $HWNDPARENT 1039
    16.     ShowWindow $0 ${SW_HIDE}
    17.     GetDlgItem $0 $HWNDPARENT 1256
    18.     ShowWindow $0 ${SW_HIDE}
    19.     GetDlgItem $0 $HWNDPARENT 1028
    20.     ShowWindow $0 ${SW_HIDE}
    21. FunctionEnd
    复制代码
    用System::Call命令调用SetWindowLong的API函数改变GWL_STYLE的样式即可,System是NSIS官方插件用于帮助用户调用系统函数,是相当重要的自动安装程序的插件!程序中其余的代码是把创建的1004页面上其余的控件给隐藏掉,后面携带的ID都是可以通过ResHacker在105包中查询到。

    贴一张大小合适的背景图

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

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

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

    无标题移动

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

    1. Function onGUICallback
    2.   ${If} $MSG = ${WM_LBUTTONDOWN}
    3.     SendMessage $HWNDPARENT ${WM_NCLBUTTONDOWN} ${HTCAPTION} $0
    4.   ${EndIf}
    5. FunctionEnd
    复制代码
    以上是回调函数,判断鼠标左键的Down事件,并且传递消息给标题栏。

    1. GetFunctionAddress $0 onGUICallback
    2. WndProc::onCallback $BGImage $0 ;处理无边框窗体移动
    复制代码
    以上是把当前的$BGImage作为回调主体,当用户左键点击$BGImage的时候,消息就传递给了窗体标题栏,实现了无边框的移动

    结束语

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


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

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

    比如:

    1. ;贴小图
    2. ${NSD_CreateBitmap} 0 34 100% 100% ""
    3. Pop $MiddleImage
    4. ${NSD_SetImage} $MiddleImage $PLUGINSDIR\middle.bmp $ImageHandle

    5. ;贴背景大图
    6. ${NSD_CreateBitmap} 0 0 100% 100% ""
    7. Pop $BGImage
    8. ${NSD_SetImage} $BGImage $PLUGINSDIR\bg.bmp $ImageHandle
    复制代码
    本文所需所有插件下载地址:http://pan.baidu.com/s/1kTLvIuz
    本地下载: 自定义界面之无边框窗体移动贴图.zip (307.57 KB, 下载次数: 329)
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2019-11-3 14:42
  • 签到天数: 68 天

    [LV.6]常住居民II

    107

    主题

    466

    帖子

    5349

    积分

    积分
    5349
    发表于 2015-7-15 07:01:06 | 显示全部楼层
    这个教程是自定义美化页面为数不多的精品教程之一,虽然有些代码不太完美,但借鉴意义很大,想做美化包,必读!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    7

    帖子

    57

    积分

    积分
    57
    发表于 2015-7-20 17:19:40 | 显示全部楼层
    正需要这个教程,这个网站太好了,原来是在梦想8,但是梦想8打不开了。。。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    16

    积分

    积分
    16
    发表于 2015-10-19 15:28:30 | 显示全部楼层
    这个下载了 学习了下 不错 有创意,但是感觉内存消耗比较大 xp下如有崩溃
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    36

    积分

    积分
    36
    发表于 2015-10-26 09:26:43 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    15

    积分

    积分
    15
    发表于 2015-12-29 00:52:50 | 显示全部楼层
    好东西好东西
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4

    帖子

    5

    积分

    积分
    5
    发表于 2016-1-22 14:30:33 | 显示全部楼层
    好东西,认真学习
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    12

    帖子

    25

    积分

    积分
    25
    发表于 2017-4-14 14:29:38 | 显示全部楼层
    可以看到第一个界面,但是就卡主不动了,需要开任务管理器删掉
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    15

    积分

    积分
    15
    发表于 2018-1-30 17:03:26 | 显示全部楼层
    开始学习了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    17

    帖子

    84

    积分

    积分
    84
    发表于 2018-3-22 14:46:53 | 显示全部楼层
    学习了啊
    回复

    使用道具 举报

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

    本版积分规则

    Archiver|手机版|小黑屋|联系我们|鲁ICP备12005273号 |  

    © 2015-2020 nsisfans.com.   All Rights Reserved.

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