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

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

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

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

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

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

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

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

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

    Вложения:

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

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

    VT: ссылка.

    Код (Inno):
    1. [Setup]
    2. AppName=Test
    3. AppVerName=Test
    4. CreateAppDir=no
    5.  
    6. [Files]
    7. Source: Files\*; Flags: dontcopy
    8.  
    9. [Components]
    10. Name: comp1; Description: "Компонент 1";
    11. Name: comp2; Description: "Компонент 2";
    12. Name: comp3; Description: "Компонент 3";
    13. Name: comp4; Description: "Компонент 4 (без изображения)";
    14.  
    15. [Code]
    16. function  ImgLoad(hWnd: HWND; FileName: PAnsiChar; Left, Top, Width, Height: Integer; Stretch, IsBkg: Boolean) :LongInt; external 'ImgLoad@{tmp}\botva2.dll stdcall delayload';
    17. procedure ImgGetPosition(Img: LongInt; var Left, Top, Width, Height: Integer); external 'ImgGetPosition@{tmp}\botva2.dll stdcall delayload';
    18. procedure ImgApplyChanges(hWnd: HWND); external 'ImgApplyChanges@{tmp}\botva2.dll stdcall delayload';
    19. procedure ImgRelease(Img: LongInt); external 'ImgRelease@{tmp}\botva2.dll stdcall delayload';
    20. procedure GDIpShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';
    21.  
    22. function  pImgLoad(hWnd: HWND; FileName: PAnsiChar; Left, Top, Width, Height: Integer; Stretch, IsBkg: Boolean): LongInt;
    23. begin
    24. if not FileExists(FileName) then begin
    25.   if not FileExists(ExpandConstant('{tmp}\' + FileName)) then ExtractTemporaryFile(FileName);
    26.   Result:=ImgLoad(hWnd, ExpandConstant('{tmp}\') + FileName, Left, Top, Width, Height, Stretch, IsBkg);
    27.   DeleteFile(ExpandConstant('{tmp}\') + FileName);
    28.  end else Result:=ImgLoad(hWnd, FileName, Left, Top, Width, Height, Stretch, IsBkg);
    29. end;
    30.  
    31. // Отступ для окна с изображением:
    32. const
    33.   pLeft = 060; // Слева
    34.   pTop  = 130; // Сверху
    35.  
    36. // Переменные:
    37. var
    38.   CursorPoint: TPoint; // Координаты курсора
    39.   ComponetForm: TForm; // Форма для вывода изображения
    40.   ComponentImg: LongInt; // Переменная для вывода изображения
    41.   OldShowComponents: Byte; // Переменная хранящая значение Index, облегчит прорисовку
    42.   Get_Left, Get_Top, Get_Width, Get_Height: Integer; // Переменные хранящие координаты и разрешение изображения
    43.  
    44. procedure Statistics(Index: Integer);
    45. begin
    46.   WizardForm.Caption:='X: '+IntToStr(Get_Width)+' | Y: '+IntToStr(Get_Height)+' | W: '+IntToStr(ComponetForm.Width)+' | H: '+IntToStr(ComponetForm.Height)+' | Index: '+IntToStr(Index);
    47. end;
    48.  
    49. procedure LoadComponentImg(FileName: String);
    50. begin
    51.   ImgRelease(ComponentImg); // Удаляем изображение из памяти
    52.   ComponentImg:=pImgLoad(ComponetForm.Handle, FileName, 0,0,0,0, False, False); // Загружаем изображение из файла
    53.   ImgGetPosition(ComponentImg, Get_Left, Get_Top, Get_Width, Get_Height); // Получаем координаты и разрешение изображения
    54.   ComponetForm.SetBounds(ScaleX(WizardForm.Left + pLeft + CursorPoint.X), ScaleY(WizardForm.Top + pTop + CursorPoint.Y), ScaleX(Get_Width), ScaleY(Get_Height)); // Применяем размер
    55.   ImgApplyChanges(ComponetForm.Handle); // Прорисовываем
    56.   ComponetForm.Show; // Показываем форму
    57.   WizardForm.SetFocus;
    58. end;
    59.  
    60. procedure ComponetMouseListLeave(Sender: TObject);
    61. begin
    62.   OldShowComponents:=-1; // Для корректной работы с Index'ом
    63.   ImgRelease(ComponentImg); // Удаляем изображение из памяти
    64.   ComponetForm.Hide; // Скрываем форму
    65. end;
    66.  
    67. procedure ComponetFormMouseMove(Sender: TObject; Shift: TShiftState; X: Integer; Y: Integer);
    68. begin
    69.   ComponetMouseListLeave(Sender);
    70. end;
    71.  
    72. procedure ComponentsListMouseMove(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea);
    73. var
    74.   i: Integer;
    75. begin
    76. if OldShowComponents <> Index then begin
    77.   OldShowComponents:=Index; // Выводим Index в переменную
    78.   CursorPoint.X:=X; CursorPoint.Y:=Y; // Получаем координаты курсора
    79.   for i:=0 to 1 do begin // хз, как сделать без этого костыля
    80.   case Index of
    81.     0: LoadComponentImg('01.jpg'); // Тут настраиваем все компоненты
    82.     1: LoadComponentImg('02.jpg'); //
    83.     2: LoadComponentImg('03.jpg'); //
    84.   else begin
    85.     OldShowComponents:=Index; // Для корректной работы с Index'ом
    86.     ImgRelease(ComponentImg); // Удаляем изображение из памяти
    87.     ComponetForm.Hide; // Скрываем форму
    88.   end;
    89.   end;
    90.  end;
    91. end;
    92.   CursorPoint.X:=X; CursorPoint.Y:=Y; // Получаем координаты курсора
    93.   ComponetForm.Left:=ScaleX(WizardForm.Left + pLeft + CursorPoint.X); // Применяем смещение слева
    94.   ComponetForm.Top:=ScaleY(WizardForm.Top + pTop + CursorPoint.Y); // Применяем смещение сверху
    95.   //
    96.   Statistics(Index); // test
    97. end;
    98.  
    99. procedure InitializeWizard;
    100. begin
    101. with WizardForm do begin
    102.   InnerNotebook.Hide;
    103.   OuterNotebook.Hide; Bevel.Hide;
    104.   ComponentsList.Left:=40;
    105.   ComponentsList.TabStop:=False;
    106.   ComponentsList.Parent:=WizardForm;
    107.   ComponentsList.OnItemMouseMove:=@ComponentsListMouseMove; // Применяем свой обработчик событий
    108.   ComponentsList.OnMouseLeave:=@ComponetMouseListLeave; // Применяем свой обработчик событий
    109.   //
    110.   ComponetForm:=TForm.Create(nil); // Создание формы
    111.   with ComponetForm do begin
    112.     AutoScroll:=False;
    113.     FormStyle:=fsStayOnTop;
    114.     OnMouseMove:=@ComponetFormMouseMove; // Применяем свой обработчик событий
    115.     BorderStyle:=bsNone; // Применяем стиль
    116.     Hide; // Скрываем, на всякий
    117.   end;
    118.   //
    119.   OldShowComponents:=-1; // Для корректной работы с Index'ом
    120.  end;
    121. end;
    122.  
    123. function InitializeSetup: Boolean;
    124. begin
    125.   if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
    126.   Result:=True;
    127. end;
    128.  
    129. procedure DeinitializeSetup;
    130. begin
    131.   GDIpShutdown;
    132. end;
     

    Вложения:

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

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

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

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

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

    Код (Inno):
    1. [Setup]
    2. AppName=Test
    3. AppVerName=Test
    4. CreateAppDir=no
    5.  
    6. [Files]
    7. Source: Files\*; Flags: dontcopy
    8.  
    9. [Components]
    10. Name: comp0; Description: "Компонент 0";
    11. Name: comp1; Description: "Компонент 1";
    12. Name: comp2; Description: "Компонент 2";
    13. Name: comp3; Description: "Компонент 3 (без изображения)";
    14.  
    15. [Code]
    16. //   ╔═══════════╗
    17. //═══╣ ▼ WinApi  ╠
    18. function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
    19. function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
    20. function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
    21. function ScreenToClient(hWnd: HWND; var lpPoint: TPoint): BOOL; external 'ScreenToClient@user32.dll stdcall';
    22. function ListBox_GetItemRect(const hWnd: HWND; const Msg: Integer; Index: LongInt; var Rect: TRect): LongInt; external 'SendMessageW@user32.dll stdcall';
    23.  
    24. //   ╔═══════════╗
    25. //═══╣ ▼ botva2  ╠
    26. type
    27.   TCallbackProc = function(h:hWnd; Msg, wParam, lParam: Longint): Longint;
    28.  
    29. function  SetActiveWindow(hWnd: HWND): HWND; external 'SetActiveWindow@user32.dll stdcall delayload';
    30. function  ImgLoad(hWnd: HWND; FileName: PAnsiChar; Left, Top, Width, Height: Integer; Stretch, IsBkg: Boolean) :LongInt; external 'ImgLoad@{tmp}\botva2.dll stdcall delayload';
    31. procedure ImgGetPosition(Img: LongInt; var Left, Top, Width, Height: Integer); external 'ImgGetPosition@{tmp}\botva2.dll stdcall delayload';
    32. procedure ImgApplyChanges(hWnd: HWND); external 'ImgApplyChanges@{tmp}\botva2.dll stdcall delayload';
    33. procedure ImgRelease(Img: LongInt); external 'ImgRelease@{tmp}\botva2.dll stdcall delayload';
    34. procedure GDIpShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';
    35. function  WndProcCallBack(Callback: TCallbackProc; ParamCount: integer): LongWord; external 'wrapcallbackaddr@{tmp}\CallbackCtrl.dll stdcall delayload';
    36.  
    37. function  pImgLoad(hWnd: HWND; FileName: PAnsiChar; Left, Top, Width, Height: Integer; Stretch, IsBkg: Boolean): LongInt;
    38. begin
    39. if not FileExists(FileName) then begin
    40.   if not FileExists(ExpandConstant('{tmp}\' + FileName)) then ExtractTemporaryFile(FileName);
    41.   Result:=ImgLoad(hWnd, ExpandConstant('{tmp}\') + FileName, Left, Top, Width, Height, Stretch, IsBkg);
    42.   DeleteFile(ExpandConstant('{tmp}\') + FileName);
    43.  end else Result:=ImgLoad(hWnd, FileName, Left, Top, Width, Height, Stretch, IsBkg);
    44. end;
    45.  
    46. //   ╔═════════╗
    47. //═══╣ ▼ Code  ╠
    48. const
    49.   pLeft = 060;
    50.   pTop  = 130;
    51.   //
    52.   GWL_WNDPROC      =  -4;
    53.   //
    54.   WM_MOUSEMOVE      = $0200;
    55.   WM_MOUSELEAVE     = $02A3;
    56.   //
    57.   LB_ITEMFROMPOINT =  $01A9;
    58.   LB_GETITEMRECT   =  $0198;
    59.  
    60. var
    61.   CursorPos: TPoint;
    62.   ComponetForm: TForm;
    63.   ComponentImg: LongInt;
    64.   ListBoxItemRect: TRect;
    65.   OldProcListBox: LongInt;
    66.   OldShowComponents, nIndex: Integer;
    67.   Get_Left, Get_Top, Get_Width, Get_Height: Integer;
    68.  
    69. procedure LoadComponentImg(FileName: String);
    70. begin
    71.   ImgRelease(ComponentImg);
    72.   ComponentImg:=pImgLoad(ComponetForm.Handle, FileName, 0,0,0,0, False, False);
    73.   ImgGetPosition(ComponentImg, Get_Left, Get_Top, Get_Width, Get_Height);
    74.   ComponetForm.SetBounds(ScaleX(WizardForm.Left + pLeft + CursorPos.X), ScaleY(WizardForm.Top + pTop + CursorPos.Y), ScaleX(Get_Width), ScaleY(Get_Height));
    75.   ImgApplyChanges(ComponetForm.Handle);
    76.   ComponetForm.Show;
    77.   SetActiveWindow(WizardForm.Handle);
    78. end;
    79.  
    80. procedure ListLeave;
    81. begin
    82.   OldShowComponents:=-1;
    83.   ImgRelease(ComponentImg);
    84.   ComponetForm.Hide;
    85. end;
    86.  
    87. procedure ComponentsListMouseMove(X, Y, Index: Integer);
    88. var
    89.   i: Integer;
    90. begin
    91. if OldShowComponents <> Index then begin
    92.   OldShowComponents:=Index;
    93.   for i:=0 to 1 do begin
    94.   case Index of
    95.     0: LoadComponentImg('01.jpg');
    96.     1: LoadComponentImg('02.jpg');
    97.     2: LoadComponentImg('03.jpg');
    98.   else begin
    99.     OldShowComponents:=Index;
    100.     ImgRelease(ComponentImg);
    101.     ComponetForm.Hide;
    102.    end;
    103.   end;
    104.  end;
    105. end;
    106.   ComponetForm.Left:=ScaleX(WizardForm.Left + pLeft + CursorPos.X);
    107.   ComponetForm.Top:=ScaleY(WizardForm.Top + pTop + CursorPos.Y);
    108. end;
    109.  
    110. function PointIListBoxItemRect(const Rect: TRect; const Point: TPoint): Boolean;
    111. begin
    112.   Result:=(Point.X >= ListBoxItemRect.Left) and (Point.X <= ListBoxItemRect.Right) and (Point.Y >= ListBoxItemRect.Top) and (Point.Y <= ListBoxItemRect.Bottom);
    113. end;
    114.  
    115. function newListBoxProc(hWnd: HWND; Msg, wParam, lParam: Longint): Longint;
    116. begin
    117. case Msg of
    118.   WM_MOUSEMOVE: begin
    119.     GetCursorPos(CursorPos);
    120.     ScreenToClient(WizardForm.ComponentsList.Handle, CursorPos);
    121.     //
    122.     nIndex:=SendMessage(WizardForm.ComponentsList.Handle, LB_ITEMFROMPOINT, 0, CursorPos.x or (CursorPos.y shl 16));
    123.     ListBox_GetItemRect(WizardForm.ComponentsList.Handle, LB_GETITEMRECT, nIndex, ListBoxItemRect);
    124.     if not PointIListBoxItemRect(ListBoxItemRect, CursorPos) then nIndex:=-1;
    125.     ComponentsListMouseMove(CursorPos.X, CursorPos.Y, nIndex);
    126.     //
    127.     WizardForm.Caption:='Index: '+IntToSTR(nIndex)+' | Cur: x='+IntToStr(CursorPos.X)+', y='+IntToStr(CursorPos.Y)+' | left='+
    128.     IntToStr(ListBoxItemRect.Left)+', top='+IntToStr(ListBoxItemRect.Top)+', right='+IntToStr(ListBoxItemRect.Right)+', bottom='+IntToStr(ListBoxItemRect.Bottom);
    129.   end;
    130.   WM_MOUSELEAVE: begin
    131.     nIndex:=-1;
    132.     ListLeave;
    133.   end;
    134. end;
    135.   Result:=CallWindowProc(OldProcListBox, hWnd, Msg, wParam, lParam);
    136. end;
    137.  
    138. procedure InitializeWizard;
    139. begin
    140. with WizardForm do begin
    141.   InnerNotebook.Hide;
    142.   OuterNotebook.Hide; Bevel.Hide;
    143.   ComponentsList.Left:=40;
    144.   ComponentsList.TabStop:=False;
    145.   ComponentsList.Parent:=WizardForm;
    146.   OldProcListBox:=SetWindowLong(ComponentsList.Handle, GWL_WNDPROC, WndProcCallBack(@newListBoxProc, 4));
    147.   //
    148.   ComponetForm:=TForm.Create(nil);
    149.   with ComponetForm do begin
    150.     AutoScroll:=False;
    151.     FormStyle:=fsStayOnTop;
    152.     BorderStyle:=bsNone;
    153.     Hide;
    154.   end;
    155.   //
    156.   OldShowComponents:=-1;
    157.  end;
    158. end;
    159.  
    160. //   ╔═══════════╗
    161. //═══╣ ▼ Default ╠
    162. function InitializeSetup: Boolean;
    163. begin
    164.   if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
    165.   if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
    166.   Result:=True;
    167. end;
    168.  
    169. procedure DeinitializeSetup;
    170. begin
    171.   SetWindowlong(WizardForm.ComponentsList.Handle, GWL_WNDPROC, OldProcListBox);
    172.   GDIpShutdown;
    173. end;

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

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