【问题标题】:Inno setup: Display Images using timerInno 设置:使用计时器显示图像
【发布时间】:2014-11-27 23:15:10
【问题描述】:

我们正在使用以下代码在完成页面上显示图像(幻灯片)。

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=userdocs:Inno Setup Examples Output

[Files]
Source: "Image1.bmp"; Flags: dontcopy
Source: "Image2.bmp"; Flags: dontcopy
Source: "Image3.bmp"; Flags: dontcopy
Source: "InnoCallback.dll"; Flags: dontcopy

[Code]
var
  TimerID: Integer;
  SlideID: Integer;
  BackImage: TBitmapImage;
  Panel: TPanel;

type
  TTimerProc = procedure(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; SysTime: DWORD);
  TDirectShowEventProc = procedure(EventCode, Param1, Param2: Integer);

function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord;
  external 'wrapcallback@files:InnoCallback.dll stdcall';    
function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT; lpTimerFunc: UINT):    UINT;         external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; 
  external 'KillTimer@user32.dll stdcall'; 

procedure URLOnClick(Sender: TObject);
var
  ErrorCode: Integer;
begin

  ShellExec('open', 'http://www.google.com/', '', '', SW_SHOW, ewWaitUntilTerminated,  ErrorCode);

end;

procedure OnSlideTimer(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; SysTime: DWORD);
begin
  case SlideID of 
    0: SlideID := 1;
    1: SlideID := 2;
    2: SlideID := 0;
  end;
  BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image' + IntToStr(SlideID + 1) + '.bmp'));
 end;

procedure StartSlideTimer;
var
  TimerCallback: LongWord;
begin
  TimerCallback := WrapTimerProc(@OnSlideTimer, 4);

  TimerID := SetTimer(0, 0, 2000, TimerCallback);
 end;


 procedure InitializeWizard;  
var
ContentHeight: Integer;
begin
  TimerID := 0;
  SlideID := 0;
  ContentHeight := WizardForm.OuterNotebook.Top + WizardForm.OuterNotebook.Height;
  ExtractTemporaryFile('Image1.bmp');
  ExtractTemporaryFile('Image2.bmp');
  ExtractTemporaryFile('Image3.bmp');

  Panel := TPanel.Create(WizardForm);
  Panel.Parent := WizardForm;
  Panel.Left := 200;
  Panel.Top := WizardForm.OuterNotebook.Top + 200;
  Panel.Width := ScaleX(220);
  Panel.Height := ScaleY(40);
  Panel.Visible := False;

  BackImage := TBitmapImage.Create(WizardForm);
  BackImage.Parent := Panel;
  BackImage.Width:= ScaleX(210);
  BackImage.Height:= ScaleY(35);
  BackImage.Left := (Panel.Height - BackImage.Height) div 2;
  BackImage.Top := (Panel.Height - BackImage.Height) div 2;
  BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image1.bmp'));
  BackImage.OnClick := @URLOnClick; 
  StartSlideTimer;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  Panel.Visible := CurPageID = wpFinished;
end;

我的问题是,这里的图像每 2 秒就会改变一次。如果我点击 Image1,它应该打开 google.com,如果我点击 Image2,它应该打开 Yahoo.com。

请帮帮我。

【问题讨论】:

    标签: inno-setup


    【解决方案1】:

    您知道SlideID 变量中显示了哪张幻灯片,并且您拥有名为URLOnClick 的图像点击事件方法(顺便说一句,这种事件方法不是一个好名字。)。因此,只需以这种方式修改该事件方法:

    procedure URLOnClick(Sender: TObject);
    var
      URL: string;
      ErrorCode: Integer;
    begin
      URL := '';
      case SlideID of
        0: URL := 'http://www.google.com/'; // <- Image1
        1: URL := 'http://www.yahoo.com/'; // <- Image2
      end;
      if URL <> '' then
        ShellExec('open', URL, '', '', SW_SHOW, ewWaitUntilTerminated,  ErrorCode);
    end;
    

    【讨论】:

    • 当我使用 .gif 文件时,除了上面代码中的 .bmp 文件,运行时间错误:位图图像无效
    • BackImage 是 TBitmapImage,它不允许加载 .gif 文件。
    • 有加载.gif文件的功能吗?
    • 在 inno 设置中,我只能看到位图文件的功能,但我想要一个旋转图像。所以需要 gif 文件/图像。
    • @user1752602,目前不支持位图以外的文件,但如果其他人还没有建议新功能,那么建议一个新功能是个好主意。如果发布的 Delphi 的 TImage 类包含 PNGImageJPEGGifImg 单元,则所有这些文件类型都将受支持。所以从实现的角度来看,这很容易。
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多