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;