sergy22051988
Новичок
Привет знатокам и умельцам, не подкинете скрипт к стандартному компонент листу чтоб при наведении на него картинка двигалась за курсором и можно было бы  ставить разных размеров картинки
Заранее СПС.
				
			Заранее СПС.
Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
sergy22051988, почитайте форум уже было 2 примера, на основе библиотеки и расширенной версии:
http://krinkels.org/threads/kak-sde...-kursorom-pri-navedenii-na-nego-kursora.3641/
[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;sergy22051988, вот. Лучше использовать jpg формат, с png на машине Windows Xp иногда выскакивает проблема с неправильным определением ширины и высоты.
VT: ссылка.
Код:[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;
[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; .
.