Inno Setup GIF 显示插件 GIFCtrl (V2.1 版本)


引用来自  test.iss 引用来自 test.iss
; -- test.iss --
; restools
; http://restools.hanzify.org
; gifctrl.dll 为一个用于 Inno Setup 的 13 KB 的 gif 显示插件,同样可以显示 BMP 和 JPEG。

; V2.1 可以同时显示 64 个 GIF 图片。解决插件加载后卸载时的延迟问题.

[Setup]
AppName=gifctrl
AppVerName=gifctrl Ver 2.1
DefaultDirName={pf}\gifctrl
DefaultGroupName=gifctrl
OutputDir=userdocs:Inno Setup Examples Output
SolidCompression=yes

[Files]
Source: "gifctrl.dll"; Flags: dontcopy solidbreak
Source: nsisinstall.gif; Flags: dontcopy solidbreak
Source: 0023.gif; Flags: dontcopy solidbreak
Source: "MyProg.exe"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]
Name: "{group}\gifctrl"; Filename: "{app}\MyProg.exe"

[code]
const
  
HALIGN_CENTER = 0; //水平居中
  
HALIGN_LEFT = 1;   //水平靠左
  
HALIGN_RIGHT = 2;  //水平靠右

  
VALIGN_CENTER = 0; //垂直居中
  
VALIGN_TOP = 1;    //垂直靠上
  
VALIGN_BOTTOM = 2; //垂直靠下

  
FIT_NONE = 0;      //不适应窗口
  
FIT_WIDTH = 1;     //适应窗口宽度
  
FIT_HEIGHT = 2;    //适应窗口高度
  
FIT_BOTH = 3;      //适应窗口宽度和高度
  
  
CLR_INVALID = $FFFFFFFF; //自动取容器左上角的颜色作为底色,如果取色失败,用按钮颜色代替。

// 创建 Gif 窗口
function NewGifbWnd(hWndParent: HWND; X, Y, nWidth, nHeight: Integer): HWND; external 'newgifwnd@files:gifctrl.dll stdcall';

// 释放 Gif 窗口
function FreeGifWnd(hWndGif: HWND): Boolean; external 'freegifwnd@files:gifctrl.dll stdcall';

// 释放所有 Gif 窗口
function FreeAllGifWnd(): Boolean; external 'freeallgifwnd@files:gifctrl.dll stdcall';

// 设置 Gif 窗口的父窗口
function GifWndSetParent(hWndGif: HWND; hWndParent: HWND): Boolean; external 'gifwndsetparent@files:gifctrl.dll stdcall';

// 设置 Gif 窗口的位置大小
function GifWndSetBounds(hWndGif: HWND; X, Y, nWidth, nHeight: Integer): Boolean; external 'gifwndsetbounds@files:gifctrl.dll stdcall';

// 载入图片,并设置图片显示位置
function GifWndLoadFromFile(hWndGif: HWND; HAlign, VAlign: Integer; BGColor: DWord; Fit: integer; GifFileName: PChar): Boolean; external 'gifwndloadfromfile@files:gifctrl.dll stdcall';
// 第1 次载入需要指定图片文件“GifFileName”,然后在需要重新载入另外图片的时候重新指定另外的图片文件,重新调整 Align 位置时也需要调用此函数,
// 但是如果只是为了调整 Align 而不想重新载入一次 GifFileName 文件,只需要把 GifFileName 设置为空字符串就可以达到只调整位置,不重载文件。

var
  
GifPanel: TPanel;
  GIFHWND1, GIFHWND2: HWND;

function InitializeSetup(): Boolean;
begin
  
GIFHWND1 := 0;
  GIFHWND2 := 0;
  Result := True;
end;

procedure DeinitializeSetup();
begin
  
FreeAllGifWnd();
end;

procedure LblOnClick(Sender: TObject);
var
  
ErrorCode: Integer;
begin
  
ShellExec('open', 'http://restools.hanzify.org', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure InitializeWizard();
var
  
GifFileName: String;
  Lbl: TNewStaticText;
begin
  
ExtractTemporaryFile('nsisinstall.gif');
  ExtractTemporaryFile('0023.gif');

  GIFHWND1 := NewGifbWnd(WizardForm.InstallingPage.Handle, 0, WizardForm.PROGRESSGAUGE.Top + WizardForm.PROGRESSGAUGE.Height + SCaleY(5),
       WizardForm.InstallingPage.Width, WizardForm.InstallingPage.Height - (WizardForm.PROGRESSGAUGE.Top
       + WizardForm.PROGRESSGAUGE.Height + SCaleY(5)));
  GifWndLoadFromFile(GIFHWND1, HALIGN_CENTER, VALIGN_BOTTOM, CLR_INVALID, FIT_WIDTH, ExpandConstant('{tmp}\nsisinstall.gif'));

  // 创建一个网站 Logo 连接
  
GIFHWND2 := NewGifbWnd(WizardForm.Handle, ScaleX(30), WizardForm.Bevel.Top + ScaleY(8), 88, 31);
  GifWndLoadFromFile(GIFHWND2, HALIGN_CENTER, VALIGN_CENTER, CLR_INVALID, FIT_NONE, ExpandConstant('{tmp}\0023.gif'));
  Lbl := TNewStaticText.Create(WizardForm);
  Lbl.Parent := WizardForm;
  Lbl.AutoSize := False;
  Lbl.SetBounds(ScaleX(30), WizardForm.Bevel.Top + ScaleY(8), 88, 31);
  Lbl.OnClick := @LblOnClick;
  Lbl.Cursor := crHand;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if
CurPageID = wpInstalling then
  begin
    
MsgBox('暂停一下,看看效果。', mbInformation, MB_OK);
  end;
end;


点击下面连接下载例子。
http://restools.hanzify.org/inno/gifctrl/inno_gifctrl_v2.1.zip



评论: 30 | 引用: 0 | 查看次数: 32757
Dreamcast [2010-12-28 11:07 AM]
等待阿信修正,暂时用D4的代码顶着 ^^
xin [2010-10-24 12:19 AM]
引用来自 Dreamcast 引用来自 Dreamcast
想问下,我使用此插件打包后的安装程序在取消时会有2~3秒的假死状态,然后才会退出,代码用你默认的,只是把图片改成jpg的而已,为啥呢?

是有这个问题, 像原来的 WebCtrl 的插件那样的问题, 卸载有延迟, 我会找时间去修正的. WebCtrl 的卸载延迟问题早前已经解决了.
D4llower [2010-10-14 03:51 AM]
引用内容 引用内容
引用来自 Dreamcast
想问下,我使用此插件打包后的安装程序在取消时会有2~3秒的假死状态,然后才会退出,代码用你默认的,只是把图片改成jpg的而已,为啥呢?


function ShowWindow(hWnd: Integer; uType: Integer): Integer;  //导入必要的 API 函数
external 'ShowWindow@user32.dll stdcall';

procedure DeinitializeSetup();
begin
  //首先,这个 背景窗体(MainForm) 我们就不用管了,因为这个例子根本原本就没设置显示~~接下来:
  WizardForm.Hide;                          //隐藏 向导窗体(WizardForm),本人比较懒,能不用 API 就不用 API,呵呵
  ShowWindow(Application.Handle, SW_HIDE);  //隐藏 应用程序窗体(Application),这个没法了,只能用 API 了^_^
  //Msgbox('暂停一下,看看效果。', mbConfirmation, MB_OK)
  UninitGifCtrl();                          //这是原版的语句了,实际上说了一大通,就是在这前面加了两句,外加导入一个API,呵呵
end;
D4llower [2010-10-14 03:48 AM]
引用内容 引用内容
引用来自 Dreamcast
想问下,我使用此插件打包后的安装程序在取消时会有2~3秒的假死状态,然后才会退出,代码用你默认的,只是把图片改成jpg的而已,为啥呢?


对于假死的情况(实际只是插件调用过程导致的延迟,本也无可厚非),我们想到了解决方法,就是隐藏窗体,执行过程放到后台,不让用户察觉,
这是一个不错的思路,也是可行的,于是我们就选择了隐藏 向导窗体(WizardForm),方法就是:

    ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), SW_HIDE);  //等价于 WizardForm.Hide,所以可以不用 API;

但我们发现窗体是隐藏了,任务栏却仍然赖在那里,所以为了“毁尸灭迹”,我们就要把 应用程序窗体(Application) 也隐藏起来:

    ShowWindow(Application.Handle, SW_HIDE);                        //很可惜,这个没有等价的属性设置方法了,呵呵

当然,如果你的程序本身设置了显示 背景窗体(MainForm),那么也不要忘了把它也一同隐藏了:

    ShowWindow(StrToInt(ExpandConstant('{hwnd}')), SW_HIDE);        //等价于 MainForm.Hide,所以可以不用 API;

综上,对于现在这个例子,需要编写的代码就是这个样子喽(字数又超了,待会儿发):
D4llower [2010-10-14 03:44 AM]
引用内容 引用内容
引用来自 Dreamcast
想问下,我使用此插件打包后的安装程序在取消时会有2~3秒的假死状态,然后才会退出,代码用你默认的,只是把图片改成jpg的而已,为啥呢?


先说下,Inno Setup 会绘制 3 个窗体——背景窗体(MainForm)、向导窗体(WizardForm) 和 应用程序窗体(Application)。

  背景窗体(MainForm):顾名思义就是指安装程序的背景,一般是深蓝色的,但默认即不显示,用户也不大喜欢把它设置成显示状态。

  向导窗体(WizardForm):就是我们最常见的安装向导界面了,这个一般肯定就是显示的了。
  应用程序窗体(Application):这是 Inno Setup 的后台窗体,也是控制任务栏显示用的,实际上这种方式也继承自 Pascal 的习惯。
WLDNA [2010-04-19 09:34 PM]
引用来自 Dreamcast 引用来自 Dreamcast
想问下,我使用此插件打包后的安装程序在取消时会有2~3秒的假死状态,然后才会退出,代码用你默认的,只是把图片改成jpg的而已,为啥呢?


那个是停止播放 gif的,可以参考 IsSkin的,再 反初始化的时候,先隐藏 WizardForm,再进行下面的操作,呵呵
Dreamcast [2010-03-25 10:46 PM]
想问下,我使用此插件打包后的安装程序在取消时会有2~3秒的假死状态,然后才会退出,代码用你默认的,只是把图片改成jpg的而已,为啥呢?
xin [2008-07-11 10:21 PM]
不清楚你的脚本怎么写,无法回答你的这个问题。
mboomxy [2008-07-04 01:06 PM]
请问下为什么我设置以后没有动了?

   HALIGN_CENTER = 0; //水平居中
   HALIGN_LEFT = 1;   //水平靠左
   HALIGN_RIGHT = 2;  //水平靠右

   VALIGN_CENTER = 0; //垂直居中
   VALIGN_TOP = 1;    //垂直靠上
   VALIGN_BOTTOM = 500; //垂直靠下

   FIT_NONE = 0;      //不适应窗口
   FIT_WIDTH = 1;     //适应窗口宽度
   FIT_HEIGHT = 2;    //适应窗口高度
   FIT_BOTH = 30;      //适应窗口宽度和高度
xin [2008-06-22 09:39 PM]
你的是非正规做法,当然会导致功能缺失,正规做法是使用 DeleteMenu
引用内容 引用内容
[code]
const MF_BYPOSITION=$400;

function DeleteMenu(HMENU: HWND; uPosition: UINT; uFlags: UINT): BOOL;
external 'DeleteMenu@user32.dll stdcall';

function GetSystemMenu(HWND: hWnd; bRevert: BOOL): HWND;
external 'GetSystemMenu@user32.dll stdcall';

procedure InitializeWizard();
begin
  
DeleteMenu(GetSystemMenu(wizardform.handle,false),8,MF_BYPOSITION);
  DeleteMenu(GetSystemMenu(wizardform.handle,false),7,MF_BYPOSITION);
end;

发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 5000 字 | UBB代码 开启 | [img]标签 关闭