杉宫竹苑工作室

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

Inno Setuo 创建闪屏和背景音乐

[复制链接]
发表于 2017-3-6 17:13:37 | 显示全部楼层 |阅读模式

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

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

x
NSIS 插件 advsplash.dll 现在有了进一步的更新,新插件的名称为 newadvsplash.dll,新的插件支持 bmp、gif 和 jpg 图像作为闪屏,闪屏可透明。背景音乐可以为 wav 和 mp3 格式,可循环播放。
原则上使用该 NSIS 插件就可以制作带闪屏和背景音乐的 INNO 安装程序了,但是该插件播放音乐的功能有个欠缺,就是不能暂停播放。
因此推荐另外一个功能更强的音乐播放插件 BASSMOD.DLL,用该插件可以播放压缩率高音质高的 MOD 格式音乐文件,且支持暂停等功能。
  1. ; INNO SETUP 脚本文件
  2. ; 该示例脚本创建带闪屏和背景音乐的安装程序
  3. ; 使用了:
  4. ;   - restools 的调用 NSIS 插件的通用插件 CallNSIS.DLL,详见 [url]http://bbs.hanzify.org/read.php?tid=38694[/url]
  5. ;   - 用于添加闪屏和背景音乐的 NSIS 插件 NewAdvSplash.DLL,详见 [url]http://nsis.sourceforge.net/NewAdvSplash_plug-in[/url]
  6. ;   - 播放 MOD 音乐的插件 BASSMOD.DLL,详见 [url]http://un4seen.com/bassmod.html[/url]
  7. ;
  8. ; 汉化新世纪 gnatix,2006.9.8

  9. [Setup]
  10. AppName=我的程序
  11. AppVerName=我的程序 1.5 版本
  12. DefaultDirName={pf}我的程序
  13. DefaultGroupName=我的程序

  14. [Files]
  15. ; 打包实现闪屏和背景音乐所必需的插件文件
  16. Source: "Z:NSISADDINcallnsis.dll"; DestDir: "{tmp}"; Flags: dontcopy
  17. Source: "Z:NSISADDINNewAdvSplash.dll"; DestDir: "{tmp}"; Flags: dontcopy
  18. Source: "Z:NSISADDINBassmod.dll"; DestDir: "{tmp}"; Flags: dontcopy
  19. ; 打包闪屏和背景音乐素材文件:闪屏图像文件 bmp、gif 或者 jpg 格式, 音乐文件 MOD 格式
  20. Source: "Z:NSISADDINsplash.gif"; DestDir: "{tmp}"; Flags: dontcopy
  21. Source: "Z:NSISADDINmymusic.mod"; DestDir: "{tmp}"; Flags: dontcopy
  22. ; 以下打包软件本身的文件
  23. ; 请自己加上

  24. ; 以下是安装脚本的其它段代码
  25. ; 请自己加上

  26. [Code]
  27. var
  28. AboutButton: TButton;
  29. MusicSwitchLabel0, MusicSwitchLabel1, MusicSwitchLabel2: TNewStaticText;

  30. // 以下是所调用的插件函数
  31. function BASSMOD_Init(device: Integer; freq, flags: DWORD): Boolean;
  32. external 'BASSMOD_Init@files:BASSMOD.dll stdcall delayload';

  33. procedure BASSMOD_MusicFree();
  34. external 'BASSMOD_MusicFree@files:BASSMOD.dll stdcall delayload';

  35. function BASSMOD_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): Boolean;
  36. external 'BASSMOD_MusicLoad@files:BASSMOD.dll stdcall delayload';

  37. function BASSMOD_MusicPlay(): Boolean;
  38. external 'BASSMOD_MusicPlay@files:BASSMOD.dll stdcall delayload';

  39. function BASSMOD_MusicPause(): Boolean;
  40. external 'BASSMOD_MusicPause@files:BASSMOD.dll stdcall delayload';

  41. procedure BASSMOD_Free();
  42. external 'BASSMOD_Free@files:BASSMOD.dll stdcall delayload';

  43. procedure callplug(parentwnd: Integer; pluginname,funcname,param1,param2,param3,param4,param5,param6,param7,param8,param9,param10: PChar);
  44. external 'callplug@files:callnsis.dll stdcall delayload';

  45. // 以下是点击“关于”按钮后的响应函数
  46. procedure AboutButtonOnClick(Sender: TObject);
  47. begin
  48. MsgBox('这是你的信息。'#13#10'这是你的信息的第二行。', mbInformation, MB_OK);
  49. end;

  50. // 以下是点击“打开音乐”按钮后的响应函数
  51. procedure MusicSwitchLabel1OnClick(Sender: TObject);
  52. begin
  53.   BASSMOD_MusicPlay;
  54.   MusicSwitchLabel1.Font.Color := clGray;
  55.   MusicSwitchLabel2.Font.Color := clBlue;
  56. end;

  57. // 以下是点击“关闭音乐”按钮后的响应函数
  58. procedure MusicSwitchLabel2OnClick(Sender: TObject);
  59. begin
  60.   BASSMOD_MusicPause;
  61.   MusicSwitchLabel2.Font.Color := clGray;
  62.   MusicSwitchLabel1.Font.Color := clBlue;
  63. end;

  64. // 安装向导初始化函数
  65. procedure InitializeWizard();
  66. var
  67. BGMusicFile, SplashFile: string;
  68. begin
  69. // 创建“关于”按钮
  70. AboutButton := TButton.Create(WizardForm);
  71. AboutButton.Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
  72. AboutButton.Top := WizardForm.CancelButton.Top;
  73. AboutButton.Width := WizardForm.CancelButton.Width;
  74. AboutButton.Height := WizardForm.CancelButton.Height;
  75. AboutButton.Caption := '关于(&A)...';
  76. AboutButton.OnClick := @AboutButtonOnClick;
  77. AboutButton.Parent := WizardForm;

  78. // 创建文字标签“音乐:”
  79. MusicSwitchLabel0 := TNewStaticText.Create(WizardForm);
  80. MusicSwitchLabel0.Left := AboutButton.Left + ScaleX(90);
  81. MusicSwitchLabel0.Top := WizardForm.CancelButton.Top + ScaleY(3);
  82. MusicSwitchLabel0.Width := ScaleX(30);
  83. MusicSwitchLabel0.Height := ScaleY(12);
  84. MusicSwitchLabel0.Font.Color := clRed;
  85. MusicSwitchLabel0.Caption := '音乐:';
  86. MusicSwitchLabel0.Parent := WizardForm;

  87. // 创建文字标签作为“打开音乐”按钮(采用 Webdings 字体中的播放符号)
  88. MusicSwitchLabel1 := TNewStaticText.Create(WizardForm);
  89. MusicSwitchLabel1.Left := MusicSwitchLabel0.Left + ScaleX(33);
  90. MusicSwitchLabel1.Top := MusicSwitchLabel0.Top - ScaleY(3);
  91. MusicSwitchLabel1.Width := ScaleX(20);
  92. MusicSwitchLabel1.Height := ScaleY(12);
  93. MusicSwitchLabel1.Font.Color := clGray;
  94. MusicSwitchLabel1.Font.Name := 'webdings';
  95. MusicSwitchLabel1.Font.Size := -15;
  96. MusicSwitchLabel1.Cursor := crCross;
  97. MusicSwitchLabel1.Caption := #52
  98. MusicSwitchLabel1.ShowHint:= true;
  99. MusicSwitchLabel1.Hint:= '打开音乐';
  100. MusicSwitchLabel1.OnClick := @MusicSwitchLabel1OnClick;
  101. MusicSwitchLabel1.Parent := WizardForm;

  102. // 创建文字标签作为“关闭音乐”按钮(采用 Webdings 字体中的暂停符号)
  103. MusicSwitchLabel2 := TNewStaticText.Create(WizardForm);
  104. MusicSwitchLabel2.Left := MusicSwitchLabel1.Left + ScaleX(20);
  105. MusicSwitchLabel2.Top := MusicSwitchLabel0.Top - ScaleY(3);
  106. MusicSwitchLabel2.Width := ScaleX(20);
  107. MusicSwitchLabel2.Height := ScaleY(12);
  108. MusicSwitchLabel2.Font.Color := clBlue;
  109. MusicSwitchLabel2.Font.Name := 'webdings';
  110. MusicSwitchLabel2.Font.Size := -15;
  111. MusicSwitchLabel2.Cursor := crCross;
  112. MusicSwitchLabel2.Caption := #59
  113. MusicSwitchLabel2.ShowHint:= true;
  114. MusicSwitchLabel2.Hint:= '关闭音乐';
  115. MusicSwitchLabel2.OnClick := @MusicSwitchLabel2OnClick;
  116. MusicSwitchLabel2.Parent := WizardForm;

  117. // 释放临时文件
  118. ExtractTemporaryFile(ExpandConstant('BASSMOD.dll'));
  119. ExtractTemporaryFile(ExpandConstant('CallNSIS.DLL'));
  120. ExtractTemporaryFile(ExpandConstant('NewAdvSplash.DLL'));
  121. ExtractTemporaryFile(ExpandConstant('mymusic.mod'));
  122. ExtractTemporaryFile(ExpandConstant('splash.gif'));

  123. BGMusicFile := ExpandConstant('{tmp}mymusic.mod');
  124. SplashFile := ExpandConstant('{tmp}splash.gif');

  125. // 播放背景音乐
  126. if not BASSMOD_Init(-1,44100,0) then
  127.   BASSMOD_Free;
  128. BASSMOD_MusicFree;
  129. if BASSMOD_MusicLoad(false, PChar(BGMusicFile), 0, 0, 4) then
  130.   BASSMOD_MusicPlay;

  131. // 闪屏:显示时间 1600、淡入 800、淡出 500、透明颜色 -2 (表示 gif 图像本身透明)
  132. CALLPLUG(0,ExpandConstant('{tmp}NewAdvSplash.dll'),'show','1600','800','500','-2',SplashFile,'','','','','');

  133. // 以下是安装向导初始化函数的其它代码
  134. // 请自己加上
  135. end;

  136. // 以下是其它 CODE 段代码
  137. // 请自己加上
复制代码


post-377-1157691928.gif

回复

使用道具 举报

 楼主| 发表于 2017-3-6 17:14:49 | 显示全部楼层
顶楼所介绍的脚本中播放音乐使用的是一个叫 BASSMOD.DLL 插件,该插件仅用于播放 MOD 格式的音乐文件(XM, IT, S3M, MOD, MTM, UMX)。该插件还有一个姊妹插件叫 BASS.DLL,它的功能更多更强。因为有人希望本人能够提供一个类似于顶楼但是能够播放 MP3 音乐文件的脚本,所以自己抽时间把 BASS.DLL 这方面的功能研究了一下,写出了下面的示例脚本。

该脚本与顶楼的脚本很相似,只是把插件 BASSMOD.DLL 换成了 BASS.DLL,把背景音乐 mymusic.mod 换成了 mymusic.mp3。BASS.DLL 文件可以从下面下载,mymusic.mp3 请自己准备(我这里找不到个头小的 mp3 文件),其它文件请从顶楼下载。WAV 格式的音乐文件也是支持的。
  1. ; INNO SETUP 脚本文件
  2. ; 该示例脚本创建带闪屏和背景音乐的安装程序


  3. [Setup]
  4. AppName=我的程序
  5. AppVerName=我的程序 1.5 版本
  6. DefaultDirName={pf}\我的程序
  7. DefaultGroupName=我的程序

  8. [Files]
  9. ; 打包实现闪屏和背景音乐所必需的插件文件
  10. Source: "Z:\NSISADDIN\callnsis.dll"; DestDir: "{tmp}"; Flags: dontcopy
  11. Source: "Z:\NSISADDIN\NewAdvSplash.dll"; DestDir: "{tmp}"; Flags: dontcopy
  12. Source: "Z:\NSISADDIN\Bass.dll"; DestDir: "{tmp}"; Flags: dontcopy
  13. ; 打包闪屏和背景音乐素材文件:闪屏图像文件 bmp、gif 或者 jpg 格式, 音乐文件 MP3、WAV 格式
  14. Source: "Z:\NSISADDIN\splash.gif"; DestDir: "{tmp}"; Flags: dontcopy
  15. Source: "Z:\NSISADDIN\mymusic.mp3"; DestDir: "{tmp}"; Flags: dontcopy
  16. ; 以下打包软件本身的文件
  17. ; 请自己加上

  18. ; 以下是安装脚本的其它段代码
  19. ; 请自己加上

  20. [Code]
  21. Type
  22. HSAMPLE = DWORD;
  23. HCHANNEL = DWORD;

  24. var
  25. MusicSwitchLabel0, MusicSwitchLabel1, MusicSwitchLabel2: TNewStaticText;
  26. sample: HSAMPLE;
  27. channel: HCHANNEL;

  28. // 以下是所调用的插件函数
  29. function BASS_Init(device: Integer; freq, flags: DWORD; win: HWND; clsid: string): Boolean;
  30. external 'BASS_Init@files:BASS.dll stdcall delayload';

  31. procedure BASS_Free();
  32. external 'BASS_Free@files:BASS.dll stdcall delayload';

  33. function BASS_SampleLoad(mem: BOOL; f: PChar; offset, length, max, flags: DWORD): HSAMPLE;
  34. external 'BASS_SampleLoad@files:BASS.dll stdcall delayload';

  35. function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL;
  36. external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

  37. function BASS_ChannelPause(handle: DWORD): BOOL;
  38. external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';

  39. function BASS_SampleGetChannel(handle: HSAMPLE; onlynew: BOOL): HCHANNEL;
  40. external 'BASS_SampleGetChannel@files:BASS.dll stdcall delayload';

  41. procedure callplug(parentwnd: Integer; pluginname,funcname,param1,param2,param3,param4,param5,param6,param7,param8,param9,param10: PChar);
  42. external 'callplug@files:callnsis.dll stdcall delayload';

  43. // 以下是点击“关于”按钮后的响应函数
  44. procedure AboutButtonOnClick(Sender: TObject);
  45. begin
  46. MsgBox('这是你的信息。'#13#10'这是你的信息的第二行。', mbInformation, MB_OK);
  47. end;

  48. // 以下是点击“打开音乐”按钮后的响应函数
  49. procedure MusicSwitchLabel1OnClick(Sender: TObject);
  50. begin
  51.   BASS_ChannelPlay(channel, false);
  52.   MusicSwitchLabel1.Font.Color := clGray;
  53.   MusicSwitchLabel2.Font.Color := clBlue;
  54. end;

  55. // 以下是点击“关闭音乐”按钮后的响应函数
  56. procedure MusicSwitchLabel2OnClick(Sender: TObject);
  57. begin
  58.   BASS_ChannelPause(channel);
  59.   MusicSwitchLabel2.Font.Color := clGray;
  60.   MusicSwitchLabel1.Font.Color := clBlue;
  61. end;

  62. // 安装向导初始化函数
  63. procedure InitializeWizard();
  64. var
  65. AboutButton: TButton;
  66. BGMusicFile, SplashFile: string;
  67. begin
  68. // 创建“关于”按钮
  69. AboutButton := TButton.Create(WizardForm);
  70. AboutButton.Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
  71. AboutButton.Top := WizardForm.CancelButton.Top;
  72. AboutButton.Width := WizardForm.CancelButton.Width;
  73. AboutButton.Height := WizardForm.CancelButton.Height;
  74. AboutButton.Caption := '关于(&A)...';
  75. AboutButton.OnClick := @AboutButtonOnClick;
  76. AboutButton.Parent := WizardForm;

  77. // 创建文字标签“音乐:”
  78. MusicSwitchLabel0 := TNewStaticText.Create(WizardForm);
  79. MusicSwitchLabel0.Left := AboutButton.Left + ScaleX(90);
  80. MusicSwitchLabel0.Top := WizardForm.CancelButton.Top + ScaleY(3);
  81. MusicSwitchLabel0.Width := ScaleX(30);
  82. MusicSwitchLabel0.Height := ScaleY(12);
  83. MusicSwitchLabel0.Font.Color := clRed;
  84. MusicSwitchLabel0.Caption := '音乐:';
  85. MusicSwitchLabel0.Parent := WizardForm;

  86. // 创建文字标签作为“打开音乐”按钮(采用 Webdings 字体中的播放符号)
  87. MusicSwitchLabel1 := TNewStaticText.Create(WizardForm);
  88. MusicSwitchLabel1.Left := MusicSwitchLabel0.Left + ScaleX(33);
  89. MusicSwitchLabel1.Top := MusicSwitchLabel0.Top - ScaleY(3);
  90. MusicSwitchLabel1.Width := ScaleX(20);
  91. MusicSwitchLabel1.Height := ScaleY(12);
  92. MusicSwitchLabel1.Font.Color := clGray;
  93. MusicSwitchLabel1.Font.Name := 'webdings';
  94. MusicSwitchLabel1.Font.Size := -15;
  95. MusicSwitchLabel1.Cursor := crCross;
  96. MusicSwitchLabel1.Caption := #52
  97. MusicSwitchLabel1.ShowHint:= true;
  98. MusicSwitchLabel1.Hint:= '打开音乐';
  99. MusicSwitchLabel1.OnClick := @MusicSwitchLabel1OnClick;
  100. MusicSwitchLabel1.Parent := WizardForm;

  101. // 创建文字标签作为“关闭音乐”按钮(采用 Webdings 字体中的暂停符号)
  102. MusicSwitchLabel2 := TNewStaticText.Create(WizardForm);
  103. MusicSwitchLabel2.Left := MusicSwitchLabel1.Left + ScaleX(20);
  104. MusicSwitchLabel2.Top := MusicSwitchLabel0.Top - ScaleY(3);
  105. MusicSwitchLabel2.Width := ScaleX(20);
  106. MusicSwitchLabel2.Height := ScaleY(12);
  107. MusicSwitchLabel2.Font.Color := clBlue;
  108. MusicSwitchLabel2.Font.Name := 'webdings';
  109. MusicSwitchLabel2.Font.Size := -15;
  110. MusicSwitchLabel2.Cursor := crCross;
  111. MusicSwitchLabel2.Caption := #59
  112. MusicSwitchLabel2.ShowHint:= true;
  113. MusicSwitchLabel2.Hint:= '关闭音乐';
  114. MusicSwitchLabel2.OnClick := @MusicSwitchLabel2OnClick;
  115. MusicSwitchLabel2.Parent := WizardForm;

  116. // 释放临时文件
  117. ExtractTemporaryFile('BASS.dll');
  118. ExtractTemporaryFile('CallNSIS.DLL');
  119. ExtractTemporaryFile('NewAdvSplash.DLL');
  120. ExtractTemporaryFile('mymusic.mp3');
  121. ExtractTemporaryFile('splash.gif');

  122. BGMusicFile := ExpandConstant('{tmp}\mymusic.mp3');
  123. SplashFile := ExpandConstant('{tmp}\splash.gif');

  124. // 播放背景音乐
  125. if not BASS_Init(-1,44100,0,0,'') then
  126.   BASS_Free;
  127. sample := BASS_SampleLoad(false, PChar(BGMusicFile), 0, 0, 1, 4);
  128. if sample<>0 then
  129.   begin
  130.   channel:= BASS_SampleGetChannel(sample, false);
  131.   BASS_ChannelPlay(channel, true);
  132.   end;

  133. // 闪屏:显示时间 1600、淡入 800、淡出 500、透明颜色 -2 (表示 gif 图像本身透明)
  134. callplug(0,ExpandConstant('{tmp}\NewAdvSplash.dll'),'show','1600','800','500','-2',SplashFile,'','','','','');

  135. // 以下是安装向导初始化函数的其它代码
  136. // 请自己加上
  137. end;

  138. // 以下是其它 CODE 段代码
  139. // 请自己加上
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-6 17:16:21 | 显示全部楼层
纯inno脚本实现的闪屏,调用Win32 API实现,无需额外DLL,可以作为存为iss文件include来使用。
不过有一定局限性,只能使用bmp文件。
  1. //调用方法:
  2. //ShowSplash(bmp文件名, 宽,高, 淡入/淡出毫秒时间, 图片静止毫秒时间);

  3. function SetLayeredWindowAttributes(hWnd: HWND; ColorRef: TColor; bAlpha:
  4. byte; dwFlags: LongInt): boolean;
  5. external 'SetLayeredWindowAttributes@user32 stdcall';

  6. function SetWindowLong(hWnd : HWND; nIndex : integer; dwNewLong : Longint):
  7. Longint;
  8. external 'SetWindowLongA@user32 stdcall';

  9. function GetWindowLong(hWnd : HWND; nIndex : integer): LongInt;
  10. external 'GetWindowLongA@user32 stdcall';

  11. const
  12.     WS_EX_LAYERED = $80000;
  13.     GWL_EXSTYLE = -20;
  14.     LWA_COLORKEY = 1;
  15.     LWA_ALPHA = 2;

  16.     FadeStep = 10;

  17. procedure SetTransparentForm(AHandle : THandle; AValue : byte);
  18. begin
  19.   SetWindowLong(AHandle, GWL_EXSTYLE, GetWindowLong(AHandle, GWL_EXSTYLE) or
  20. WS_EX_LAYERED);
  21.   SetLayeredWindowAttributes(AHandle, 0, AValue, LWA_ALPHA);
  22. end;

  23. procedure ShowSplash(splashFileName: String; Width, Height, fadetime, stilltime: LongInt);
  24. var
  25.     SplashForm: TForm;
  26.     SplashImage: TBitmapImage;
  27.     i, SleepSetp: LongInt;
  28. begin
  29.     SplashForm := TForm.create(nil);
  30.     with SplashForm do
  31.   begin
  32.         Parent := nil;
  33.         BorderStyle := bsNone;
  34.         Position := poScreenCenter;
  35.         ClientWidth := Width;
  36.         ClientHeight := Height;
  37.   end;
  38.     SplashImage := TBitmapImage.Create(SplashForm);
  39.     with SplashImage do
  40.     begin
  41.         BitMap.LoadFromFile(SplashFileName);
  42.         Stretch := true;
  43.         Align := alClient;
  44.         Parent := SplashForm;
  45.     end;
  46.     with SplashForm do
  47.     begin
  48.         SetTransparentForm(SplashForm.handle, 0);
  49.         show;
  50.         Repaint;
  51.         SleepSetp := fadetime * FadeStep / 255;
  52.         for i := 1 to 255/FadeStep do
  53.         begin
  54.             SetTransparentForm(SplashForm.handle, i * FadeStep);
  55.             Sleep(SleepSetp);
  56.         end;
  57.         sleep(stilltime);
  58.         for i := 255/FadeStep downto 1 do
  59.         begin
  60.             SetTransparentForm(SplashForm.handle, i * FadeStep);
  61.             Sleep(SleepSetp);
  62.         end;
  63.         close;
  64.         release;
  65.   end;
  66. end;

  67. 使用实例:
  68. CODE

  69. procedure InitializeWizard();
  70. begin
  71.     ExtractTemporaryFile('MySplash.bmp');
  72.     ShowSplash(ExpandConstant('{tmp}\MySplash.bmp'), 240,200, 1000,3000);
  73. end;
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 19:46 , Processed in 0.129986 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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