innosetup教程【2】如何通过[code]字段自定义安装界面

原文链接 点击查看原文

目标要求:
       1、 界面border去掉原本windows自带的对话框格式,采取扁平化设计;
       2、 简化安装流程,不要弹出那么多安装向导页,不要让用户一直点“下一步”,简洁人性化;
       3、 安装界面可加载漂亮的背景图片;
       4、 优化安装包安装时间。
       原型设计:

 

界面1

界面2

界面3

       开发工具:
       因为之前采用Inno setup设计,而且它拥有Pascal脚本引擎,功能算强大,故采用Inno setup。
       主要流程:

       

流程图

       由图中可以清晰地看出,所有向导页之间都是通过“下一步”或者“上一步”进行驱动更换的。
       概要分析:
       这里需要调用两个美化插件动态库:botva2.dll和InnoCallback.dll,用于界面的美化和功能完善。这里就不全部把代码贴出来了,只针对其中的要点进行分析概括。
       在开始之前,先了解一下inno setup基本的过程和函数。

//该过程在开始的时候改变向导或者向导页,不要指望使用InitializeSetup函数实现改变向导页的功能,因为InitializeSetup函数触发时向导窗口并不存在。
procedure InitializeWizard();

//该函数在安装程序初始化时调用,返回False 将中断安装,True则继续安装.
function InitializeSetup(): Boolean;

//该过程提供用户完成预安装和安装之后的任务,更多的是提供了安装过程中的状态。参数CurStep=ssInstall是在程序实际安装前,CurStep=ssPostInstall是实际安装完成后,而CurStep=ssDone是在一次成功的安装完成后、安装程序终止前(即点击finish按钮后执行)。 
procedure CurStepChanged(CurStep: TSetupStep);

//当用户单击下一步按钮时调用。如果返回True,向导将移到下一页;如果返回False,它仍保留在当前页。
function NextButtonClick(CurPageID: Integer): Boolean;

//向导调用这个事件函数确定是否在所有页或不在一个特殊页 (用PageID 指定) 显示。如果返回True,将跳过该页;如果你返回False,该页被显示。注意: 这个事件函数不被wpWelcome、wpPreparing 和wpInstalling 页调用,还有安装程序已经确定要跳过的页也不会调用 (例如,没有包含组件安装程序的wpSelectComponents)。
function ShouldSkipPage(PageID: Integer): Boolean;

//在新向导页 (由CurPageID 指定) 显示后调用。
procedure CurPageChanged(CurPageID: Integer);

        1、 界面border去掉原本windows自带的对话框格式,采取扁平化设计

//设置欢迎向导页的尺寸大小: 
WizardForm.Center WizardForm.BorderStyle:=bsNone; //去掉对话框border WizardForm.ClientWidth:=601; 
WizardForm.ClientHeight:=341; 
WizardForm.InnerNotebook.Hide; 
WizardForm.OuterNotebook.Hide; 
wizardform.Color:=TransparentColor; 
WizardForm.Bevel.Hide; 
WizardForm.NextButton.Width:=0; 
WizardForm.BackButton.Width:=0; 
WizardForm.CancelButton.Width:=0; 
WizardForm.OnMouseDown:=@WizardFormMouseDown; //可拉动

       2、 简化安装包安装流程,不要用户一直点“下一步”,简洁人性化
       这里只有两个向导页,一个是选择安装目录和许可协议的界面,一个是正在安装的界面。用户只需点击“开始安装”即可安装,并有进度条和百分比显示,不用经常性地点击“下一步”。
       3、 安装界面可加载漂亮的图片和动画效果

// 创建描述位图
Bmp:= TBitmapImage.Create(WizardForm);
Bmp.Top:=ScaleX(0);
Bmp.Left:=ScaleX(0);
Bmp.Width:=WizardForm.ClientWidth;
Bmp.Height:=ScaleY(371);
Bmp.BackColor:= WizardForm.Color;
Bmp.Parent:=WizardForm;
Bmp.Bitmap.LoadFromFile(ExpandConstant('{tmp}\bg.bmp'));
Bmp.OnMouseDown := @WizardFormMouseDown; //可拉动

//动画效果
AnimateWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 400, AW_Center or AW_Activate);
SetWindowLong(StrToInt(ExpandConstant('{wizardhwnd}')),GWL_Exstyle, WS_Ex_Layered);
SetLayeredWindowAttributes(StrToInt(ExpandConstant('{wizardhwnd}')), 0, 240, LWA_Alpha);

       4、 优化安装包安装时间。
       把不用的安装文件重新梳理了一遍,减少打包时的体积,不用多次调用读写注册表。

       难点分析:
       1、 如何跳过向导页?

//主要是程序调用“下一步”,然后在ShouldSkipPage函数中进行跳过。
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID=wpWelcome then 
result := true;
if PageID=wpSelectDir then 
result := true;
end;

       2、 “下一步”如何调用?

WizardForm.NextButton.OnClick(WizardForm);

       3、 如何用鼠标拉动对话框?

重载WizardFormMouseDown过程,然后调用SendMessage(WizardForm.Handle, WM_SYSCOMMAND, $F012, 0);

       4、 如何自定义浏览文件夹按钮?

//记住,获得的路径要赋给WizardForm.DirEdit.Text,这是浏览文件夹向导页wpSelectDir的路径编辑框。
procedure DirOnClick(hBtn:HWND);
var
res: Boolean;
UserSelectDir,str: string;
begin 
UserSelectDir := Edit.Text; 
res := BrowseForFolder('浏览文件夹', UserSelectDir, True); 

if res then 
begin 
str:=Copy(UserSelectDir,Length(UserSelectDir),1);//取最后一个字符
 if '\'=str then
 Edit.Text := UserSelectDir 
else 
Edit.Text := UserSelectDir; 
end; 

//浏览文件夹向导页的文件夹路径 
WizardForm.DirEdit.Text := Edit.Text;
end;

       5、 如何点击按钮显示“许可协议”?

ShellExec('', ExpandConstant('{tmp}\license.txt'),'', '', SW_SHOW, ewNoWait, ErrorCode)。

       6、 如何安装程序完成后自动运行程序?

Exec(ExpandConstant('{app}\MySoftware.exe'), '', '', SW_SHOW, ewNoWait, RCode);

       7、 如何删除文件夹?

DelTree(ExpandConstant('{app}\文件夹名称'), True, True, False);

       8、 如何关闭向导页?

WizardForm.Close;

       9、 如何自定义完成向导页的完成按钮?

通过程序自行调用WizardForm.NextButton.OnClick(WizardForm);达到“下一步”的功能;
然后通过函数ShouldSkipPage一直调到最后完成页wpFinished;
最后调用WizardForm.NextButton.OnClick(WizardForm);完成。

       10、 如何在安装页面换背景图片?

procedure CurPageChanged(CurPageID: Integer);
begin 
if CurPageID = wpInstalling then 
begin 
Bmp:= TBitmapImage.Create(WizardForm); 
Bmp.Top:=ScaleX(0); 
Bmp.Left:=ScaleX(0); 
Bmp.Width:=WizardForm.ClientWidth;
Bmp.Height:=ScaleY(371); 
Bmp.BackColor:= WizardForm.Color;
Bmp.Parent:= WizardForm; 
Bmp.Bitmap.LoadFromFile(ExpandConstant('{tmp}\bg2.bmp')); 
Bmp.OnMouseDown := @WizardFormMouseDown; 
WizardForm.OnMouseDown:=@WizardFormMouseDown; 
end;
end;

        11、 如何读写注册表?

//读取信息
RegQueryStringValue(HKLM, 'Software\***\***','Version',svValue)
//写入信息
RegWriteStringValue(HKLM, 'Software\***\***','Version', '4.0');

        12、 安装前如何判断是否有进程正在进行?

//安装前判断是否有进程正在运行
function IsModuleLoaded(modulename: String ): Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';
IsModuleLoaded('Mysoftware.exe');

        13、 如何使用botva2.dll插件创建自定义按钮?

//调用动态库函数
function BtnCreate(hParent :HWND; Left, Top, Width, Height :integer; FileName :PAnsiChar; ShadowWidth :integer; IsCheckBtn :boolean) :HWND;
external 'BtnCreate@files:botva2.dll stdcall';

FinishBtnH := BtnCreate(WizardForm.Handle,ProgressBar.Left+ProgressBar.Width-83, ProgressBar.Top+ProgressBar.Height+ScaleX(10), ScaleX(83), ScaleY(28),ExpandConstant('{tmp}\Finish.png'),1,False);
BtnSetEvent(FinishBtnH,BtnClickEventID,WrapBtnCallback(@FinishButtonClick,1));
BtnSetVisibility(FinishBtnH,False);

        14、 百分比如何确定?

//百分比
function PBProc(h:hWnd;Msg,wParam,lParam:Longint):Longint;
var 
pr,i1,i2 : Extended; 
w : integer; 
begin 
Result:=CallWindowProc(PBOldProc,h,Msg,wParam,lParam);
 if (Msg=$402) and (WizardForm.ProgressGauge.Position>WizardForm.ProgressGauge.Min) then 
begin 
i1:=WizardForm.ProgressGauge.Position-WizardForm.ProgressGauge.Min; 
i2:=WizardForm.ProgressGauge.Max-WizardForm.ProgressGauge.Min; 
pr:=i1*100/i2; 
PrLabel.Caption:=IntToStr(Round(pr))+'%'; 
w:=Round(110*pr/100); //改变数值,达到百分比和进度条的同步 
ProgressBar.Position := w; 
end;
end;

        错误解决:
        对于某些电脑环境,安装时只要点击“退出”按钮或者安装完后总会遇到这个错误,弹出以下提示图片:

错误问题

        解决办法:

因为调用WizardForm.Close或者WizardForm.NextButton.OnClick(WizardForm)退出时没有进行WizardForm的资源释放,所以导致了该错误。只要在退出或者完成前加上WizardForm.Release即可解决。
  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: InnoSetup是一个易于使用的安装包制作工具,它提供了丰富的安装选项和自定义功能。在使用InnoSetup制作安装包时,我们可以通过自定义安装界面来满足客户的各种需求。 通过InnoSetup的宏命令和脚本语言,我们可以轻松地修改默认的安装界面,例如添加自定义控件、更改按钮文本、更改字体和颜色等。可以使用Pascal脚本和Delphi Object Pascal语言。 要自定义安装界面,我们需要首先打开InnoSetup的脚本文件(.iss文件)并找到“[Setup]”部分。在这里,我们可以设置安装程序的各种选项,例如安装的目标路径、是否需要安装桌面快捷方式、是否需要安装开始菜单项等等。 然后,我们可以添加新的页面和自定义控件,例如选择安装选项的页面、选择安装路径的页面、选择应用程序图标的页面等等。我们可以使用InnoSetup自带的控件,也可以使用自定义控件来实现更复杂的功能。 最后,我们可以为每个页面添加Pascal脚本来实现自定义逻辑,例如检查安装目录是否已存在、检查系统是否已安装必要的组件等等。 总之,InnoSetup提供了灵活的自定义安装界面功能,让我们可以满足不同客户的需求,并提高软件的用户体验。 ### 回答2: Inno Setup 可以在安装过程中自定义安装界面,使其更符合特定的软件需求和个性化需求。通过自定义安装界面,可以加强用户交互体验,提高软件的可用性和易用性,同时也可以为软件提供更精细的管理和控制。下面将分别从设计理念、开发流程和技术实现方面进行介绍。 设计理念 Inno Setup自定义安装界面开发过程,从本质上来说是一次用户交互设计 (User Experience Design, UXD) 的过程。通过 UXD,设计师可以了解客户的需求、喜好和习惯,进而设计出更符合其需求的产品和服务。在自定义安装界面开发流程中,设计师需要考虑以下几个方面: 1. 界面设计。界面设计应该简单明了、美观大方,能够吸引用户的注意力并提高用户的参与度。同时需要考虑不同用户的操作习惯和口味,以达到更广泛的用户群体。 2. 用户体验 (User Experience, UX) 设计。在设计界面时,需要考虑到用户的体验。例如:简化繁琐的操作、提供更多的选择、给予良好的反馈等都是好的用户体验设计。 3. 交互设计。特别是在软件界面方面,设计师需要思考用户将与之如何交互,如何设定第一时间与其进行沟通交流。 开发流程 在设计理念上确定了之后,我们需要有一个中间人对需求进行保存和整理。通常情况下需要特别有经验的的开发人员还需要具备美工能力,能够从业务流程到界面交互再到发布之间都能够进行系统性的构建和实践。 首先,需要准备安装向导的图片资源、控件资源等基本素材,并制定对应的管理策略。然后在1.4版本以上的 Inno Setup 中,我们可以手动复制 Setup 向导的默认源文件,再进行相应的更改即可。 接着,需要使用 Pascal 编写脚本来确保安装向导能够正确检测到用户的操作,以及完成相应的安装任务。同时,还需要定义安装向导的菜单项、默认值、文件读取方式等,以方便用户进行自定义设置和个性化操作。 最后,在整个自定义安装界面开发完成后,我们需要使用 Inno Setup 自带的编译器工具将代码打包并生成可供安装安装包,从而方便用户进行安装和使用。 技术实现方案 实现自定义安装界面的技术方案主要分为以下几个方面: 1. 界面设计工具。可以选择比较流行的界面设计工具,如 Adobe Photoshop,Axure RP,Sketch 等,这些工具都具有快速地设计复杂界面的能力。 2. 编程语言。Inno Setup 采用 Pascal 语言编写,因此需要对 Pascal 语言有一定的了解和掌握基本的编程技能。 3. Inno Setup 插件。InnoSetup 提供了一系列插件,可以方便我们在安装向导中引入大量有用的功能,如申请服务权限、加密等。 需要注意的是,Inno Setup 自定义安装界面开发风格应该以简单、实用、易于维护为原则,在设计时需要注意不要过于复杂和繁琐,以方便用户进行快速的操作和安装。 ### 回答3: Inno Setup是一款功能强大的安装程序制作软件,它可以帮助开发者快速的制作出安装程序。而自定义安装界面则是Inno Setup所提供的一个很实用的功能之一,它可以使得开发者可以自由的设计自己的安装界面,让用户有一个更加舒适的安装体验。 首先,我们需要了解Inno Setup自定义安装界面的实现方式。整个安装过程中,Inno Setup会按照一定的流程逐步展示各个界面,在每一个界面上,开发者都可以通过界面的设计和编写代码来进行自定义。 在设计安装界面时,我们可以使用Inno Setup自带的画布工具或者其他画图工具来设计出自己喜欢的安装界面,然后通过Inno Setup的代码来添加各种控件和事件。例如,我们可以添加各种按钮、文本框、进度条、复选框等控件,并通过代码来控制它们的显示和行为。 接下来,我们需要考虑自定义安装界面需要实现哪些功能。例如,我们可能需要在安装界面中添加自己的公司Logo、版本号、安装路径等信息,或者添加一些用户需要填写的信息,比如用户的名称、电子邮件和密码等。如果需要,我们也可以添加自己的安装协议和许可协议,并让用户需要点击同意才能继续安装。 总的来说,Inno Setup自定义安装界面功能非常强大,可以让开发者灵活的设计和实现自己的安装界面。但是需要注意的是,设计一个良好的安装界面需要考虑到用户的体验和操作方式,所以我们需要仔细考虑每一个控件的设计和布局,让用户能够尽可能的了解整个安装过程,并且保持简洁和易于操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值