1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Вопрос Эффект матрицы в InnoSetup

Тема в разделе "Inno Setup", создана пользователем ExPlayer, 24 июн 2014.

  1. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    Возможно ли добавить, эффект "Матрицы" в InnoSetup или вообще какие-нибудь эффекты связанные с самой формой (если я правильно выразился)?

    Поясняю:
    Интересует эффект "Матрицы", на самой форме InnoSetup, т.е. чтобы вместо заднего фона "падали" разные символы, как в фильме "Матрица", как пример:
    cryptée-600x337.jpeg

    Желательно, чтобы это "падение" было анимированным. Т.е. либо зацикленный видеоклип, либо гиф-анимация (незнаю, поддерживает ли InnoSetup такие файлы или только BMP), либо, чтобы на самой форме был такой эффект (т.е. написать отдельный код для этого).

    Надеюсь выразился доходчиво :rolleyes:
     
    Последнее редактирование: 24 июн 2014
  2. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Стандартными средствами Инно не сделать. Можно попробовать Fairy.dll от RESTOOLS
     
    ExPlayer нравится это.
  3. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    опять китайцы :(

    З.Ы. а какой язык программирования используется в InnoSetup?
    З.З.Ы. и почему не получится отдельным кодом сделать данный эффект (извиняюсь, если вопрос покажется глупым)?
     
  4. Ветеран Проверенный

    Регистрация:
    15 июн 2011
    Сообщения:
    193
    Симпатии:
    51
    Кому-чего подали?! Или же падали?
    Delphi.
    Потому что.
     
  5. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    Исправил :)


    Хороший ответ. А главное очень познавательный.:hmm:
     
  6. Ветеран Проверенный

    Регистрация:
    15 июн 2011
    Сообщения:
    193
    Симпатии:
    51
    А что ты ожидал услышать в ответ?
    Если ты не знаешь какой язык используется в Инно, то зачем тебе в деталях объяснять почему такое сделать либо сложно, либо невозможно?
     
  7. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    Я задал этот вопрос, потому что у меня стоит Inno Script Studio (собственно через который я и компилирую свои проекты), в котором есть раздел "Pascal Code". Но, если я не ошибаюсь, то синтаксис Pascal немного, но отличается от Delphi. Поэтому вопрос остается открытым.

    :scratchhead: Ведь по сути в Инно используется та же самая форма, что в проекте Delphi или я не прав? :(
     
  8. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    896
    Симпатии:
    613
    ExPlayer, не городи чушь. не форма а синтаксис. object pascal если быть точнее. если есть код рабочий на Delphi кидай. Не в принципе у меня в скрипте это как нефиг дело добавить. т.к. у меня две формы. задняя и передняя. используй ispicture и на заднюю форму уже лепи видео или анимацию через gifctrl.dll но не как через эту глючную fairy.
     
  9. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    я чушь не горожу, а просто интересуюсь. И я имел ввиду именно визиуальный компонент Form1 (возможно при чтение сообщения это не так выглядит :sorry:), а не синтаксис! Вместо того, чтобы упрекать, лучше бы объяснили, почему нельзя сделать данный эффект. Т.е. почему нельзя впихнуть код "Матрицы" из Delphi и откомпилировать данный проект в InnoSetup.
     
  10. Ветеран Проверенный

    Регистрация:
    19 дек 2011
    Сообщения:
    351
    Симпатии:
    401
    ExPlayer, не обращай внимания. Некоторые старожилы любят здесь показать свою крутость, шикарные знания и способность не задавать "глупые" вопросы, как им кажется. Поэтому ты услышал больше упреков, чем реальных советов.
    А есть код?
     
    Nemko и ExPlayer нравится это.
  11. Ветеран Проверенный

    Регистрация:
    15 июн 2011
    Сообщения:
    193
    Симпатии:
    51
    Синтаксис языка у них очень схож. Но если рассматривать это ситуацию со стороны быстродействия, то Inno явно проигрывает, т.к. это скриптованный язык, который компилируется в некий байт код (например, как java), а потом интерпретатор его уже "исполняет".
    Чтобы получить более-менее быстрый код, то нужно писать на native коде и оформить это в виде DLL (об этом нужно читать на соответствующих форумах).
     
  12. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    Спасибо за поддержку :good: Думаю, что код уже не потребуется, но на всякий случай выложу (нашел на просторах интернета проект заставки "Матрица".)

    Код (Text):
    unit f_matrix;
    {$define nodebug}
    {$E SCR}
    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls,registry;
    const
      MAXCOLUMNS = 165;
      NUMCOLUMNS:integer = 165;
      BWidth = 20;
      BHeight = 20;
      numBitmaps = 40;
      IgnoreCount : Integer = 10;

    type  TSSMode = (ssSetPwd,ssPreview,ssConfig,ssRun);
    const
      SSMode      : TSSMode = ssRun;
      TestMode    : Boolean = True;
    type
      TGraphicManager=class
      private
        { Private declarations }
        fMapWidth : integer;
        fMapHeight : Integer;
        fBitMap : TBitmap;
        fDefaultDC : THandle;

      public

         procedure BltDefaultIndex(index : Integer;x,y : integer);
         procedure StretchBltToCanvas(sr:Trect;Dest:TRect;DestDC:Thandle);
         procedure BltToCanvas(sr:Trect;DestCoord:Tpoint;DestDC:Thandle);
         property OutPutDC : THandle read FDefaultDC write fDefaultDC;
         property Bitmap : TBitmap read fBitmap write fBitmap;
         property MapHeight : integer read fmapHeight write FMapHeight;
         property MapWidth : integer read fmapwidth write fMapWidth;
      end;

      TMatrixColumn = class
      private
        fStartPos : integer;
        fRendervar : integer;
        fIntense,FNormal : TGraphicManager;
        FNumLetters,flastSentIndex,fCurrentPosition : Integer;
        fMaxy,fColumnX : integer;
        FLetterWIdth,FLetterHeight : integer;
        procedure SetIntense(const Value: TGraphicManager);
        procedure SetNormal(const Value: TGraphicManager);
        procedure SetstartPos(index: Integer);
      protected

      public
        constructor create;
        procedure RenderNext;
        Property StartPos : Integer read fstartPos write SetstartPos;
        property NumLetters : integer read fnumletters write FNumLetters;
        property Intense : TGraphicManager read fintense write SetIntense;
        property Normal : TGraphicManager read fNormal write SetNormal;
        property ColumnX : integer read FColumnX write FColumnX;
        Property MaxY : integer read fmaxy write fmaxy;

      end;



    type
    pintarray = ^intarray;
    intarray = array[0..0] of integer;

    type
      TfrmMatrix = class(TForm)
        Image1: TImage;
        Timer1: TTimer;
        Image2: TImage;
        Image3: TImage;
     
        procedure Timer1Timer(Sender: TObject);
        procedure FormActivate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormClick(Sender: TObject);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormKeyPress(Sender: TObject; var Key: Char);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
    //   fDefaultDC : THandle;
       mouse : Tpoint;
      public
        LoadingApp : Boolean;
        procedure GetPassword;

        { Public declarations }
      end;

    var
      OutDc       : THandle;
      frmMatrix: TfrmMatrix;
      bm : Tbitmap;
      empty,gm,gmi : TGraphicManager;
      Columns : Array[0..MAXCOLUMNS-1] of TMatrixColumn;
    implementation

    {$R *.DFM}

    // DEAD TEST CODE----------------

    { TGraphicManager }

    procedure TGraphicManager.BltDefaultIndex(index: Integer; x,y :Integer);
    var
      sr : TRect;
    begin
      with sr do
      begin
       left := 0;
       top  := index*FMapHeight;
       right := fMapWidth;
       bottom := top +fMapHeight;
      end;
      BltToCanvas(sr,Point(x,y),fdefaultdc);
    end;

    procedure TGraphicManager.BltToCanvas(sr: Trect; DestCoord: Tpoint;
      DestDC: Thandle);
    begin
      BitBlt(destdc,DestCoord.X,DestCoord.Y,sr.right-sr.left,sr.bottom-sr.top,fBitmap.canvas.handle,sr.Left,sr.top,srccopy);
    end;


    procedure TfrmMatrix.Timer1Timer(Sender: TObject);
    const
      c : Integer = 0;
    var
      i : integer;
      b : TBitmap;
      x, y : Integer;
    begin
      Timer1.Enabled := False;
      try
        Inc(c);
        if c = 50 then begin
          c := 0;
          try
            b := TBitmap.Create;
            b.Width := Image3.Width;
            b.Height := Image3.Height;
            x := Random(Screen.Width-Image3.Width);
            y := Random(Screen.Height-Image3.Height);
            BitBlt(b.Canvas.Handle,0,0,Image3.Width,Image3.Height,OutDC,x,y,SrcCopy);
            BitBlt(OutDC,x,y,Image3.Width,Image3.Height,Image3.Canvas.Handle,0,0,SrcCopy);
            Sleep(500);
            BitBlt(OutDC,x,y,Image3.Width,Image3.Height,b.Canvas.Handle,0,0,SrcCopy);
          finally
            b.Free;
          end;
        end;
        for i := 0 to numColumns -1 do
          Columns[i].RenderNext;
      finally
        Timer1.Enabled := True;
      end;
    end;

    procedure TfrmMatrix.FormActivate(Sender: TObject);
    var

      i : integer;
    begin
      IF Screen.Width <=800 then NUMCOLUMNS := 80;  // lower res.. don't need as many characters flying about
      if LoadingApp then begin
        LoadingApp := False;

        Mouse.X := -1;
        Mouse.Y := -1;
       // Application.OnIdle := Trigger;
    //    SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE + SWP_NOMOVE);
      //  SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@Dummy,0);    CursorOff;
       // Scrn.Visible := True;
       // SetCapture(Scrn.Handle);
       end;
    {$ifdef NODEBUG}
       ShowCursor(False);
    {$endif}
      // For Clearing out the columns
      bm := Tbitmap.create;
      bm.Width := BWidth;
      bm.Height := BHeight*5;
      bm.canvas.brush.color := clblack;
      bm.Canvas.FillRect(rect(0,0,bwidth,bheight*5));
      empty := TGraphicManager.Create;
      empty.Bitmap := bm;
      empty.MapWidth := Image2.picture.bitmap.width;
      empty.MapHeight := BHeight;
      // These are for the Leading intense characters
      gmi := TGraphicManager.Create;
      gmi.Bitmap := Image2.picture.bitmap;
      gmi.MapWidth := Image2.picture.bitmap.width;
      gmi.MapHeight := BHeight;
    // These are the normal characters
      gm := TGraphicManager.Create;
      gm.Bitmap := Image1.picture.bitmap;
      gm.MapWidth := Image1.picture.bitmap.width;
      gm.MapHeight := BHeight;
      randomize;
      for i := 0 to numColumns - 1 do begin
        Columns[i] := TMatrixColumn.Create;
        with columns[i] do
        begin
          StartPos := Random(screen.height div bheight)*bHeight;

          if random(3) = 2 then  // This column will be an blank column??
          begin
            Intense := Empty;
            Normal :=  Empty;
            NumLetters := 2;
          end else
            begin
              Intense := gmi;
              Normal := gm;
              NumLetters := NUMBITMAPS;
            end;
          ColumnX := Random(Screen.width div BWidth)*BWidth;
          MaxY := Screen.Height;
        end;
      empty.OutPutDc := OutDc;
      gmi.outputdc := OutDC;
      gm.OutputDc := OutDC;
    end;
    end;

    procedure TGraphicManager.StretchBltToCanvas(sr, Dest: TRect;
      DestDC: Thandle);
    begin

    end;

    { TMatrixColumn }

    constructor TMatrixColumn.create;
    begin
      frenderVar := 0;
    end;

    procedure TMatrixColumn.RenderNext;
    var
    newletter : integer;
    begin

      repeat
          NewLetter := random(fNumLetters);
      until newLetter <> fLastSentIndex;

      fCurrentPosition := FCurrentPosition + fLetterHeight;
      fIntense.BltDefaultIndex(NewLetter,fColumnX,FCurrentPosition);
      fNormal.BltDefaultIndex(fLastSentIndex,fcolumnX,FCurrentPosition - fLetterHeight);
      FLastSentIndex := NewLetter;
      fRenderVar := 0;
      if FcurrentPosition  > fMaxy Then
      begin
        FCurrentPosition := 0;
        self.ColumnX := Random(100) * self.FLetterWIdth;
      end;
    end;

    procedure TMatrixColumn.SetIntense(const Value: TGraphicManager);
    begin
      fLetterWidth := value.MapWidth;
      fLetterHeight := Value.MapHeight;
      fintense := Value;
    end;

    procedure TMatrixColumn.SetNormal(const Value: TGraphicManager);
    begin
      fLetterWidth := value.MapWidth;
      fLetterHeight := Value.MapHeight;
      fNormal := Value;
    end;

    procedure TMatrixColumn.SetstartPos(index : Integer);
    begin
      fCurrentPosition := index;
      FstartPos := index;
    end;

    procedure TfrmMatrix.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      bm.free;
    end;

    procedure TfrmMatrix.FormClick(Sender: TObject);
    begin
      close;
    end;

    procedure TfrmMatrix.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin

      if IgnoreCount > 0 then begin
        Dec(IgnoreCount);
        Exit;
      end;
      if (Mouse.X = -1) and (Mouse.Y = -1) then begin
        Mouse.X := X;
        Mouse.Y := Y;  end
        else
        if (Abs(X-Mouse.X) > 2) and (Abs(Y-Mouse.Y) > 2) then begin
          Mouse.X := X;
          Mouse.Y := Y;
          showCursor(true);
          close;
        //  GetPassword;
        end;
    end;

    procedure TfrmMatrix.FormKeyPress(Sender: TObject; var Key: Char);
    begin
      close;
    end;

    procedure TfrmMatrix.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      close;
    end;

    procedure TfrmMatrix.GetPassword;  
    var
      MyMod     : THandle;
      PwdFunc   : function (Parent : THandle) : Boolean; stdcall;
      SysDir    : String;  NewLen    : Integer;  MyReg     : TRegistry;
      OkToClose : Boolean;
      begin
       if (SSMode <> ssRun) or TestMode then begin
        Close;    Exit;  end;  IgnoreCount := 5;  OkToClose := False;
       MyReg := TRegistry.Create;  MyReg.RootKey := HKEY_CURRENT_USER;
       if MyReg.OpenKey('Control Panel\Desktop',False) then
       begin
         try
           try
            ShowCursor(True);
            if MyReg.ReadInteger('ScreenSaveUsePassword') <> 0 then begin
              SetLength(SysDir,MAX_PATH);
              NewLen := GetSystemDirectory(PChar(SysDir),MAX_PATH);
              SetLength(SysDir,NewLen);
              if (Length(SysDir) > 0) and (SysDir[Length(SysDir)] <> '\') then
                SysDir := SysDir+'\';
              MyMod := LoadLibrary(PChar(SysDir+'PASSWORD.CPL'));
              if MyMod = 0 then OkToClose := True else
              begin
                PwdFunc := GetProcAddress(MyMod,'VerifyScreenSavePwd');
                if PwdFunc(Handle) then              OkToClose := True;
                FreeLibrary(MyMod);          end;        end        else
              OkToClose := True;      finally        ShowCursor(False);      end;
        except      OkToClose := True;    end;  end  else    OkToClose := True;
      MyReg.Free;  if OkToClose then    Close;end;

    initialization
    finalization
    releaseDC(0,outdc);
    end.
     
    А жаль... Было бы прикольно увидеть такой эффект :)

    P.S. Я правильно понял, что с формой (извинияюсь если я не правильно называю) в InnoSetup вообще не получится ничего сделать (за исключением добавления фонового рисунка), разумеется без дополнительных DLL?
     
  13. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    896
    Симпатии:
    613
    ExPlayer, 2.rar для инно. конечно никак там. мне просто неохотно.
    второй архив это то что выше. исходники для delphi.
     

    Вложения:

    Хамик и ExPlayer нравится это.
  14. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    Во :yahoo::good: спасибо)) Только какую там DLL надо использовать (или расширенную версию компилятора?), а то при компиляции ругается на отсутствие таймера (объект Timer)
     
  15. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    896
    Симпатии:
    613
    ExPlayer, расширенная.
    Код (Text):
    procedure Matrix(Sender: TObject);
    //...
      BitmapImage[i].Top:= BitmapImage[i].Top+16; // смещение вниз.
      BitmapImage2[i].Top:= BitmapImage2[i].Top+16; //
    //...
      Interval:=10; // думаю понятно 10 мсек
     
     
    ExPlayer нравится это.
  16. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    312
    Симпатии:
    41
    Да, спасибо :dance:
     

Поделиться этой страницей