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

Вопрос Картинки к компонентам

Тема в разделе "Inno Setup", создана пользователем sergy22051988, 5 ноя 2019.

  1. Пользователь

    Регистрация:
    30 июн 2018
    Сообщения:
    12
    Симпатии:
    0
    Привет знатокам и умельцам, не подкинете скрипт к стандартному компонент листу чтоб при наведении на него картинка двигалась за курсором и можно было бы ставить разных размеров картинки

    Заранее СПС.
     
  2. Пользователь

    Регистрация:
    17 сен 2016
    Сообщения:
    33
    Симпатии:
    5
    Пол:
    Мужской
  3. Пользователь

    Регистрация:
    30 июн 2018
    Сообщения:
    12
    Симпатии:
    0
    да конечно всё это то НООООООО..... в скрипте с ботвой идёт наложение картинок друг на друга и когда картинка одна нужна другого размера то видно другую снизу

    Если бы кто мог допилить или исправить скриптик было бы всё ништяк
     

    Вложения:

    • Exp.rar
      Размер файла:
      667,4 КБ
      Просмотров:
      11
  4. Старожил Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    413
    Симпатии:
    435
    Пол:
    Мужской
    sergy22051988, вот. Лучше использовать jpg формат, с png на машине Windows Xp иногда выскакивает проблема с неправильным определением ширины и высоты.

    VT: ссылка.

    Код (Inno):
    [Setup]
    AppName=Test
    AppVerName=Test
    CreateAppDir=no

    [Files]
    Source: Files\*; Flags: dontcopy

    [Components]
    Name: comp1; Description: "Компонент 1";
    Name: comp2; Description: "Компонент 2";
    Name: comp3; Description: "Компонент 3";
    Name: comp4; Description: "Компонент 4 (без изображения)";

    [Code]
    function  ImgLoad(hWnd: HWND; FileName: PAnsiChar; Left, Top, Width, Height: Integer; Stretch, IsBkg: Boolean) :LongInt; external 'ImgLoad@{tmp}\botva2.dll stdcall delayload';
    procedure ImgGetPosition(Img: LongInt; var Left, Top, Width, Height: Integer); external 'ImgGetPosition@{tmp}\botva2.dll stdcall delayload';
    procedure ImgApplyChanges(hWnd: HWND); external 'ImgApplyChanges@{tmp}\botva2.dll stdcall delayload';
    procedure ImgRelease(Img: LongInt); external 'ImgRelease@{tmp}\botva2.dll stdcall delayload';
    procedure GDIpShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';

    function  pImgLoad(hWnd: HWND; FileName: PAnsiChar; Left, Top, Width, Height: Integer; Stretch, IsBkg: Boolean): LongInt;
    begin
    if not FileExists(FileName) then begin
      if not FileExists(ExpandConstant('{tmp}\' + FileName)) then ExtractTemporaryFile(FileName);
      Result:=ImgLoad(hWnd, ExpandConstant('{tmp}\') + FileName, Left, Top, Width, Height, Stretch, IsBkg);
      DeleteFile(ExpandConstant('{tmp}\') + FileName);
     end else Result:=ImgLoad(hWnd, FileName, Left, Top, Width, Height, Stretch, IsBkg);
    end;

    // Отступ для окна с изображением:
    const
      pLeft = 060; // Слева
      pTop  = 130; // Сверху

    // Переменные:
    var
      CursorPoint: TPoint; // Координаты курсора
      ComponetForm: TForm; // Форма для вывода изображения
      ComponentImg: LongInt; // Переменная для вывода изображения
      OldShowComponents: Byte; // Переменная хранящая значение Index, облегчит прорисовку
      Get_Left, Get_Top, Get_Width, Get_Height: Integer; // Переменные хранящие координаты и разрешение изображения

    procedure Statistics(Index: Integer);
    begin
      WizardForm.Caption:='X: '+IntToStr(Get_Width)+' | Y: '+IntToStr(Get_Height)+' | W: '+IntToStr(ComponetForm.Width)+' | H: '+IntToStr(ComponetForm.Height)+' | Index: '+IntToStr(Index);
    end;

    procedure LoadComponentImg(FileName: String);
    begin
      ImgRelease(ComponentImg); // Удаляем изображение из памяти
      ComponentImg:=pImgLoad(ComponetForm.Handle, FileName, 0,0,0,0, False, False); // Загружаем изображение из файла
      ImgGetPosition(ComponentImg, Get_Left, Get_Top, Get_Width, Get_Height); // Получаем координаты и разрешение изображения
      ComponetForm.SetBounds(ScaleX(WizardForm.Left + pLeft + CursorPoint.X), ScaleY(WizardForm.Top + pTop + CursorPoint.Y), ScaleX(Get_Width), ScaleY(Get_Height)); // Применяем размер
      ImgApplyChanges(ComponetForm.Handle); // Прорисовываем
      ComponetForm.Show; // Показываем форму
      WizardForm.SetFocus;
    end;

    procedure ComponetMouseListLeave(Sender: TObject);
    begin
      OldShowComponents:=-1; // Для корректной работы с Index'ом
      ImgRelease(ComponentImg); // Удаляем изображение из памяти
      ComponetForm.Hide; // Скрываем форму
    end;

    procedure ComponetFormMouseMove(Sender: TObject; Shift: TShiftState; X: Integer; Y: Integer);
    begin
      ComponetMouseListLeave(Sender);
    end;

    procedure ComponentsListMouseMove(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea);
    var
      i: Integer;
    begin
    if OldShowComponents <> Index then begin
      OldShowComponents:=Index; // Выводим Index в переменную
      CursorPoint.X:=X; CursorPoint.Y:=Y; // Получаем координаты курсора
      for i:=0 to 1 do begin // хз, как сделать без этого костыля
      case Index of
        0: LoadComponentImg('01.jpg'); // Тут настраиваем все компоненты
        1: LoadComponentImg('02.jpg'); //
        2: LoadComponentImg('03.jpg'); //
      else begin
        OldShowComponents:=Index; // Для корректной работы с Index'ом
        ImgRelease(ComponentImg); // Удаляем изображение из памяти
        ComponetForm.Hide; // Скрываем форму
      end;
      end;
     end;
    end;
      CursorPoint.X:=X; CursorPoint.Y:=Y; // Получаем координаты курсора
      ComponetForm.Left:=ScaleX(WizardForm.Left + pLeft + CursorPoint.X); // Применяем смещение слева
      ComponetForm.Top:=ScaleY(WizardForm.Top + pTop + CursorPoint.Y); // Применяем смещение сверху
      //
      Statistics(Index); // test
    end;

    procedure InitializeWizard;
    begin
    with WizardForm do begin
      InnerNotebook.Hide;
      OuterNotebook.Hide; Bevel.Hide;
      ComponentsList.Left:=40;
      ComponentsList.TabStop:=False;
      ComponentsList.Parent:=WizardForm;
      ComponentsList.OnItemMouseMove:=@ComponentsListMouseMove; // Применяем свой обработчик событий
      ComponentsList.OnMouseLeave:=@ComponetMouseListLeave; // Применяем свой обработчик событий
      //
      ComponetForm:=TForm.Create(nil); // Создание формы
      with ComponetForm do begin
        AutoScroll:=False;
        FormStyle:=fsStayOnTop;
        OnMouseMove:=@ComponetFormMouseMove; // Применяем свой обработчик событий
        BorderStyle:=bsNone; // Применяем стиль
        Hide; // Скрываем, на всякий
      end;
      //
      OldShowComponents:=-1; // Для корректной работы с Index'ом
     end;
    end;

    function InitializeSetup: Boolean;
    begin
      if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
      Result:=True;
    end;

    procedure DeinitializeSetup;
    begin
      GDIpShutdown;
    end;
     

    Вложения:

    • Exp.7z
      Размер файла:
      25,6 КБ
      Просмотров:
      5
    sergy22051988 нравится это.
  5. Пользователь

    Регистрация:
    17 сен 2016
    Сообщения:
    33
    Симпатии:
    5
    Пол:
    Мужской
    Nemko, а примера на ботве для оригинального IS не имеется?
     
  6. Старожил Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    413
    Симпатии:
    435
    Пол:
    Мужской
    Andreo Fadio, увы нет, в оригинальной Inno нет обработчика OnItemMouseMove, ток если через CallBack перехватывать, но я туповат для этого. Может додумаюсь как нить как при наведении Index компонента перехватить.
     
  7. Пользователь

    Регистрация:
    30 июн 2018
    Сообщения:
    12
    Симпатии:
    0
    вот за это огромное спасибо добрый человек, с первого слова меня понял безтолкового
     
  8. Старожил Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    413
    Симпатии:
    435
    Пол:
    Мужской
    Andreo Fadio, вроде родил, протестировал на Inno Setup 6.0.3(u) вроде "фунциклирует". Архив прикреплять не буду, просто добавьте CallbackCtrl.dll в папку Files.

    Код (Inno):
    [Setup]
    AppName=Test
    AppVerName=Test
    CreateAppDir=no

    [Files]
    Source: Files\*; Flags: dontcopy

    [Components]
    Name: comp0; Description: "Компонент 0";
    Name: comp1; Description: "Компонент 1";
    Name: comp2; Description: "Компонент 2";
    Name: comp3; Description: "Компонент 3 (без изображения)";

    [Code]
    //   ╔═══════════╗
    //═══╣ ▼ WinApi  ╠
    function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
    function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
    function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
    function ScreenToClient(hWnd: HWND; var lpPoint: TPoint): BOOL; external 'ScreenToClient@user32.dll stdcall';
    function ListBox_GetItemRect(const hWnd: HWND; const Msg: Integer; Index: LongInt; var Rect: TRect): LongInt; external 'SendMessageW@user32.dll stdcall';

    //   ╔═══════════╗
    //═══╣ ▼ botva2  ╠
    type
      TCallbackProc = function(h:hWnd; Msg, wParam, lParam: Longint): Longint;

    function  SetActiveWindow(hWnd: HWND): HWND; external 'SetActiveWindow@user32.dll stdcall delayload';
    function  ImgLoad(hWnd: HWND; FileName: PAnsiChar; Left, Top, Width, Height: Integer; Stretch, IsBkg: Boolean) :LongInt; external 'ImgLoad@{tmp}\botva2.dll stdcall delayload';
    procedure ImgGetPosition(Img: LongInt; var Left, Top, Width, Height: Integer); external 'ImgGetPosition@{tmp}\botva2.dll stdcall delayload';
    procedure ImgApplyChanges(hWnd: HWND); external 'ImgApplyChanges@{tmp}\botva2.dll stdcall delayload';
    procedure ImgRelease(Img: LongInt); external 'ImgRelease@{tmp}\botva2.dll stdcall delayload';
    procedure GDIpShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';
    function  WndProcCallBack(Callback: TCallbackProc; ParamCount: integer): LongWord; external 'wrapcallbackaddr@{tmp}\CallbackCtrl.dll stdcall delayload';

    function  pImgLoad(hWnd: HWND; FileName: PAnsiChar; Left, Top, Width, Height: Integer; Stretch, IsBkg: Boolean): LongInt;
    begin
    if not FileExists(FileName) then begin
      if not FileExists(ExpandConstant('{tmp}\' + FileName)) then ExtractTemporaryFile(FileName);
      Result:=ImgLoad(hWnd, ExpandConstant('{tmp}\') + FileName, Left, Top, Width, Height, Stretch, IsBkg);
      DeleteFile(ExpandConstant('{tmp}\') + FileName);
     end else Result:=ImgLoad(hWnd, FileName, Left, Top, Width, Height, Stretch, IsBkg);
    end;

    //   ╔═════════╗
    //═══╣ ▼ Code  ╠
    const
      pLeft = 060;
      pTop  = 130;
      //
      GWL_WNDPROC      =  -4;
      //
      WM_MOUSEMOVE      = $0200;
      WM_MOUSELEAVE     = $02A3;
      //
      LB_ITEMFROMPOINT =  $01A9;
      LB_GETITEMRECT   =  $0198;

    var
      CursorPos: TPoint;
      ComponetForm: TForm;
      ComponentImg: LongInt;
      ListBoxItemRect: TRect;
      OldProcListBox: LongInt;
      OldShowComponents, nIndex: Integer;
      Get_Left, Get_Top, Get_Width, Get_Height: Integer;
     
    procedure LoadComponentImg(FileName: String);
    begin
      ImgRelease(ComponentImg);
      ComponentImg:=pImgLoad(ComponetForm.Handle, FileName, 0,0,0,0, False, False);
      ImgGetPosition(ComponentImg, Get_Left, Get_Top, Get_Width, Get_Height);
      ComponetForm.SetBounds(ScaleX(WizardForm.Left + pLeft + CursorPos.X), ScaleY(WizardForm.Top + pTop + CursorPos.Y), ScaleX(Get_Width), ScaleY(Get_Height));
      ImgApplyChanges(ComponetForm.Handle);
      ComponetForm.Show;
      SetActiveWindow(WizardForm.Handle);
    end;

    procedure ListLeave;
    begin
      OldShowComponents:=-1;
      ImgRelease(ComponentImg);
      ComponetForm.Hide;
    end;

    procedure ComponentsListMouseMove(X, Y, Index: Integer);
    var
      i: Integer;
    begin
    if OldShowComponents <> Index then begin
      OldShowComponents:=Index;
      for i:=0 to 1 do begin
      case Index of
        0: LoadComponentImg('01.jpg');
        1: LoadComponentImg('02.jpg');
        2: LoadComponentImg('03.jpg');
      else begin
        OldShowComponents:=Index;
        ImgRelease(ComponentImg);
        ComponetForm.Hide;
       end;
      end;
     end;
    end;
      ComponetForm.Left:=ScaleX(WizardForm.Left + pLeft + CursorPos.X);
      ComponetForm.Top:=ScaleY(WizardForm.Top + pTop + CursorPos.Y);
    end;

    function PointIListBoxItemRect(const Rect: TRect; const Point: TPoint): Boolean;
    begin
      Result:=(Point.X >= ListBoxItemRect.Left) and (Point.X <= ListBoxItemRect.Right) and (Point.Y >= ListBoxItemRect.Top) and (Point.Y <= ListBoxItemRect.Bottom);
    end;

    function newListBoxProc(hWnd: HWND; Msg, wParam, lParam: Longint): Longint;
    begin
    case Msg of
      WM_MOUSEMOVE: begin
        GetCursorPos(CursorPos);
        ScreenToClient(WizardForm.ComponentsList.Handle, CursorPos);
        //
        nIndex:=SendMessage(WizardForm.ComponentsList.Handle, LB_ITEMFROMPOINT, 0, CursorPos.x or (CursorPos.y shl 16));
        ListBox_GetItemRect(WizardForm.ComponentsList.Handle, LB_GETITEMRECT, nIndex, ListBoxItemRect);
        if not PointIListBoxItemRect(ListBoxItemRect, CursorPos) then nIndex:=-1;
        ComponentsListMouseMove(CursorPos.X, CursorPos.Y, nIndex);
        //
        WizardForm.Caption:='Index: '+IntToSTR(nIndex)+' | Cur: x='+IntToStr(CursorPos.X)+', y='+IntToStr(CursorPos.Y)+' | left='+
        IntToStr(ListBoxItemRect.Left)+', top='+IntToStr(ListBoxItemRect.Top)+', right='+IntToStr(ListBoxItemRect.Right)+', bottom='+IntToStr(ListBoxItemRect.Bottom);
      end;
      WM_MOUSELEAVE: begin
        nIndex:=-1;
        ListLeave;
      end;
    end;
      Result:=CallWindowProc(OldProcListBox, hWnd, Msg, wParam, lParam);
    end;

    procedure InitializeWizard;
    begin
    with WizardForm do begin
      InnerNotebook.Hide;
      OuterNotebook.Hide; Bevel.Hide;
      ComponentsList.Left:=40;
      ComponentsList.TabStop:=False;
      ComponentsList.Parent:=WizardForm;
      OldProcListBox:=SetWindowLong(ComponentsList.Handle, GWL_WNDPROC, WndProcCallBack(@newListBoxProc, 4));
      //
      ComponetForm:=TForm.Create(nil);
      with ComponetForm do begin
        AutoScroll:=False;
        FormStyle:=fsStayOnTop;
        BorderStyle:=bsNone;
        Hide;
      end;
      //
      OldShowComponents:=-1;
     end;
    end;

    //   ╔═══════════╗
    //═══╣ ▼ Default ╠
    function InitializeSetup: Boolean;
    begin
      if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
      if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
      Result:=True;
    end;

    procedure DeinitializeSetup;
    begin
      SetWindowlong(WizardForm.ComponentsList.Handle, GWL_WNDPROC, OldProcListBox);
      GDIpShutdown;
    end;

    P.S.: При утечке памяти, поломке или другой неведомой фигни, я тут не причем:pardon:.
     
    Andreo Fadio нравится это.

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