通过 InnoSetup 美化安装界面
InnoSetup 的美化相应的帖子也比较多,但是代码不是很全。。。所以我专门出了这篇文章来记录下这个美化过程。
废话不多说,先上个成果:
前端er们可以直接下载 vue-nw-seed 这个分支,一键 build就出效果了。
一、InnoSetup 增强版
这个部分很重要,是实现自定义界面的绝对前置步骤。
完成这个任务也很简单,可以自己下载安装就搞定。
当然,找资源的过程比较麻烦,所以直接提供了一个,并用 node-innosetup-compiler 包裹了一下,使之可以直接在 Node.js 下应用,最终的增强版在 deps/innosetup 这里可以看到。
注意
InnoSetup 本身是开源免费的,希望大家在用的过程中注意一下作者的 LICENSE 。
二、iss 配置文件
这个部分无需赘述,对于新手来说比较复杂的一个事儿,给个文档 What is Inno Setup? 先。
1、Setup Script Sections
可以直接双击 deps/innosetup/bin/Compil32.exe 打开一个可视化的配置窗口,按照引导可以直接生成一个通用流程中简单的安装配置,会生成一个类似 setup-simple.iss 这种的 iss 配置文件。
当然,一个扁平漂亮的界面,肯定不是这种简单的配置能满足的。。。
所以,看我提供的一个 setup.iss ,其包含完整的流程控制和界面的控制。
这里的代码太长了,加上注释 455 行,就不贴过来了,戳链接进去看吧。
2、Pascal Script
在那 455 行代码中主要就是 [code] 块下面的 Pascal Script ,通过它来控制安装流程和界面的美化。
- 控制安装流程的原理是 InnoSetup 通过 Pascal Scripting: Event Functions 这种事件机制,把流程节点的控制交给
Pascal Script,使其可以控制上一步、下一步等等的操作。 - 界面的美化,主要是调用两个美化插件动态库:
botva2.dll和InnoCallback.dll。用其来控制贴图的位置和样式,和给按钮绑定相应的事件等等的。
详细的控制方式参见 setup.iss 文件中的注释,此处不再详细解释啦。。。解释起来太多了。
3、setup resources
这个部分就是用来存放贴图资源和美化插件动态库的地方。
我默认放在示例项目的 /build/setup_resources 这个位置。
如果你去看过上文 setup.iss 这个文件的话,就会发现里面的资源文件路径的配置被搞成类似这个样子
#define LicenseFilePath "_resourcesPath_\license.txt"
#define SetupIconFilePath "_resourcesPath_\logo.ico"
#define ResourcesPath "_resourcesPath_\*"
这是因为各个项目要求的打包配置和路径可能不一致,特意做了一个处理,详见build-win-setup.js
// rewrite name, version to iss
fs.readFile(issPath, null, function(err, text) {
if (err) return reject(err)
let str = iconv.decode(text, 'gbk')
.replace(/_name_/g, name)
.replace(/_appName_/g, appName)
.replace(/_version_/g, version)
.replace(/_outputPath_/g, outputPath)
.replace(/_outputFileName_/g, getOutputName(outputFileName, { name, version, platform }))
.replace(/_filesPath_/g, files)
.replace(/_resourcesPath_/g, resourcesPath)
.replace(/_appPublisher_/g, appPublisher)
.replace(/_appURL_/g, appURL)
.replace(/_appId_/g, appId)
fs.writeFile(tmpIssPath, iconv.encode(str, 'gbk'), null, function(err) {
if (err) return reject(err)
// inno setup start
innosetupCompiler(tmpIssPath, { gui: false, verbose: true }, function(err) {
fs.unlinkSync(tmpIssPath)
if (err) return reject(err)
resolve(opt)
})
})
})
如果仅仅想单纯的用 InnoSetup 打包安装美观的界面,可以自直接换一下相应的配路径置。
三、Q & A
需要单独说一下几个踩到的坑。。。
1、iss 文件需要什么特定的编码格式吗?
中文的话,需要 ansi 编码,不然用其他编码,打包出来在界面上的中文会乱码!
这也是我直接用文字贴图来代替 label 以确保界面中的文字显示万无一失的原因。
2、这个 InnoSetup 增强版 和和普通的有啥区别?
说实在的,我也没太搞明白,InnoSetup 本身就是开源和免费的,可以自己修改并编译。现在我用的这个版本应该是国内某前辈搜集的一些脚本等东西集合出来单独打包出来的一个增强版。
3、为啥不单独搞个 InnoSetup 美化的项目?
一方面不确定 InnoSetup 增强版 这个版权协议,另一方面不确定大家的需求咋样,暂时这样,让大家可以通过 源码 + 详细的注释 习得这部分的技能。如果确实这部分需求很强大,请私信我,或者发 issue 讨论下这个项目该咋整吧。
四、参考资料
通过 InnoSetup 美化安装界面的更多相关文章
- Innosetup中在安装界面左下角添加超链接
在程序的安装界面左下角加上超链接,如下图: 1. 新建一个标签,这里使用的控件是TNewStaticText ,完整的方法是 //该方法传入两个参数: //1. ParentForm:将这个URLLa ...
- 译:用InnoSetup模块化安装依赖项
译文出处:http://www.codeproject.com/Articles/20868/NET-Framework-Installer-for-InnoSetup 源文件下载:http://fi ...
- NSIS安装界面无虚线框移动
最近很多应用程序都在安装界面的美化上面下足了功夫,一个漂亮流畅的安装界面无疑会给其带来用户体验上的加分,其中一个无虚线框跟随鼠标移动比较有趣,狂翻msdn后终于找到了控制函数SystemParamet ...
- U盘安装centos7 无法进入安装界面,进入dracut命令的解决办法。
最近想要装一个centos7 玩一玩,就从网上下了个镜像,用UltraISO制作了安装U盘,准备在旧电脑上装一个. 结果始终无法进入安装界面,而是进入了dracut命令行. 从网上找了解决方法:
- Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面
在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的效果.另外ViewModel ...
- Wix 安装部署教程(九) --用WPF做安装界面
经常安装PC端的应用,特别是重装系统之后,大致分为两类.一类像QQ,搜狗输入法这样的.分三步走的:第一个页面可以自定义安装路径和软件许可.第二个页面显示安装进度条,第三个页面推荐其他应用.先不管人家怎 ...
- Tortoise SVN 安装界面
Tortoise SVN 安装界面 TortoiseSVN是Subversion版本控制系统的一个免费开源客户端,不需要为使用它而付费 第一步: 点击TortoiseSVN-1.6.6.17493-w ...
- Solidworks安装界面是英文的解决办法
[问题描述] 一样的安装文件,同事之前安装界面就是中文的,安装好以后软件也是中文的. 这几天系统挂了,重装系统后就发现安装界面是英文的,安装好以后也是英文. win7系统,位数不详,solidwork ...
- 以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转)
以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转) ; Script generated by the Inno Setup 脚本向导. ; SEE THE DOCU ...
- Wix 安装部署教程(三)自定义安装界面和行为
接上一篇自定义安装界面,这篇继续探索,首先介绍下,Wix为我们定义了五种风格,每种风格的UI都是有一定顺序的.我们可以改变安装顺序,也可以完全自定义一个Dialog插入其中.比如Wix_Mondo 风 ...
随机推荐
- mysql 必知必会整理—sql 计算函数[六]
前言 简单整理一下sql的计算函数. 正文 函数没有SQL的可移植性强 能运行在多个系统上的代码称为可移植的(portable).相对来说,多数SQL语句是可移植的,在SQL实现之间有差异时,这些差异 ...
- vue watch的this 到底是什么?
正文 watch: { value: (newV, oldV) => { this.a = newV; } } 加入该vue对象中,data 有: { data:{ a:5 } } 那么请问,如 ...
- 分享一款嵌入式开源按键框架代码工程MultiButton
一.工程简介 MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块. Github地址:https://github.com/0x1abin/MultiButton 这个项目非常精简,只 ...
- 集群部署时的分布式 session 如何实现?
面试官心理分析 面试官问了你一堆 dubbo 是怎么玩儿的,你会玩儿 dubbo 就可以把单块系统弄成分布式系统,然后分布式之后接踵而来的就是一堆问题,最大的问题就是分布式事务.接口幂等性.分布式锁, ...
- JVM简明笔记4:垃圾回收
1 垃圾回收相关算法 垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除. 判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法 . ...
- 第壹課-Install:Mirth Connect在Win10下的安装步骤
1.安装JDK,推荐安装JDK8 64位,版本jdk-8u201-windows-x64.exe. 安装JDK后,同时必须配置win10的系统环境变量[示例如下]: JAVA_HOME : F:\Ja ...
- LlamaIndex 是什么
LlamaIndex 是一个基于 LLM(大语言模型)的应用程序数据框架,适用于受益于上下文增强的场景. 这类 LLM 系统被称为 RAG(检索增强生成)系统. LlamaIndex 提供了必要的抽象 ...
- [FAQ] Python的虚拟环境和包管理
1. 创建虚拟环境 $ python -m venv test-env 2. 激活虚拟环境 windows:tutorial-env\Scripts\activate (powershell: . ...
- [Gin] 路由分组 Group 的内部实现 与 块空间 { } 的应用
通过这篇 [Gin] 单文件极简 HTTP Server 流程分析 ( gin-gonic/gin ) 我们知道了 gin.go 中的 Engine 继承有 routergroup.go 中的 Rou ...
- 数据改变后更新UI(SetProperty/RaiseCanExecuteChanged)
View代码 1 <StackPanel> 2 <TextBlock Text="方法一"></TextBlock> 3 <TextBox ...