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

sergy22051988

Новичок
Привет знатокам и умельцам, не подкинете скрипт к стандартному компонент листу чтоб при наведении на него картинка двигалась за курсором и можно было бы ставить разных размеров картинки

Заранее СПС.
 

sergy22051988

Новичок
sergy22051988, почитайте форум уже было 2 примера, на основе библиотеки и расширенной версии:
http://krinkels.org/threads/kak-sde...-kursorom-pri-navedenii-na-nego-kursora.3641/
да конечно всё это то НООООООО..... в скрипте с ботвой идёт наложение картинок друг на друга и когда картинка одна нужна другого размера то видно другую снизу

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

Вложения

  • 667.4 KB Просмотры: 14

Nemko

Дилетант
Модератор
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;
 

Вложения

  • 25.6 KB Просмотры: 12

Nemko

Дилетант
Модератор
Andreo Fadio, увы нет, в оригинальной Inno нет обработчика OnItemMouseMove, ток если через CallBack перехватывать, но я туповат для этого. Может додумаюсь как нить как при наведении Index компонента перехватить.
 

sergy22051988

Новичок
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;
вот за это огромное спасибо добрый человек, с первого слова меня понял безтолкового
 

Nemko

Дилетант
Модератор
Andreo Fadio, вроде родил, протестировал на Inno Setup 6.0.3(u) вроде "фунциклирует". Архив прикреплять не буду, просто добавьте CallbackCtrl.dll в папку Files.

Код:
[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:.
 
Сверху