Вопрос Свой курсор

Carlos

Участник
Модератор
Собственно интересует скрипт для использования своего курсора в инсталляторе.
 

vint56

Ветеран
Проверенный
Carlos,
Код:
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Files]
Source: InstallFiles\cursor.ani; Flags: dontcopy

[code]
const
MyCursor = 101;

var
hcur: Cardinal;

function LoadCursorFromFile(FileName: String): Cardinal; external 'LoadCursorFromFile{#A}@user32 stdcall';
function DeleteObject(p1: Longword): BOOL; external 'DeleteObject@gdi32.dll stdcall';

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\cursor.ani')) then ExtractTemporaryFile('cursor.ani');
Result := True;
end;

procedure InitializeWizard();
begin
with WizardForm do begin
Cursor := MyCursor;
end;
hcur := LoadCursorFromFile(ExpandConstant('{tmp}\cursor.ani'));
Screen.Cursors[MyCursor] := hcur;

with WizardForm.CancelButton do
begin
  Cursor := MyCursor;
end;
with WizardForm.NextButton do
begin
  Cursor := MyCursor;
end;
with WizardForm.BackButton do
begin
  Cursor := MyCursor;
end;
end;

procedure DeinitializeSetup();
begin
  DeleteObject(hcur);
end;
 

SBalykov

Старожил
А можно и так:
Код:
#define A = (Defined UNICODE) ? "W" : "A"

[Setup]
AppName = My Program
AppVersion = 1.5
DefaultDirName = {pf}\My Program
DefaultGroupName = My Program
RawDataResource = MyCursor:InstallFiles\cursor.ani

[Code]
function LoadCursorFromFile(FileName: String): Cardinal; external 'LoadCursorFromFile{#A}@user32 stdcall';
function DeleteObject(p1: Longword): BOOL; external 'DeleteObject@gdi32.dll stdcall';

const
  MyCursor = 101;
  RT_RCDATA = 10;

var
  ResStream: TResourceStream;
  hcur: Cardinal;

procedure InitializeWizard();
begin
  ResStream := TResourceStream.Create(HInstance, '_IS_MYCURSOR', RT_RCDATA);
  ResStream.SaveToFile(ExpandConstant('{tmp}\cursor.ani'));
  hcur := LoadCursorFromFile(ExpandConstant('{tmp}\cursor.ani'));
  Screen.Cursors[MyCursor] := hcur;

  WizardForm.BackButton.Cursor := MyCursor;
  WizardForm.DirBrowseButton.Cursor := MyCursor;
  WizardForm.GroupBrowseButton.Cursor := MyCursor;
  WizardForm.NextButton.Cursor := MyCursor;
  WizardForm.CancelButton.Cursor := MyCursor;
end;

procedure DeinitializeSetup();
begin
  DeleteObject(hcur);
end;
 
Последнее редактирование:

Carlos

Участник
Модератор
nik1967, с ним пробовал, но скрипт от vint56 подошёл лучше. С расширением файла курсора меньше проблем.
 

Carlos

Участник
Модератор
Поставил свой курсор в скрипт, отображается всё прекрасно, но есть один нюанс, который никак не могу решить.
На кнопке музыки отображается стандартный курсор, как это исправить?
И соответственно, в окошке, где слайд шоу, курсор тоже стандартный.

На всех кнопках поменял, а вот как в этих местах изменить не могу понять.
 

SBalykov

Старожил
Поставил свой курсор в скрипт, отображается всё прекрасно, но есть один нюанс, который никак не могу решить.
На кнопке музыки отображается стандартный курсор, как это исправить?
И соответственно, в окошке, где слайд шоу, курсор тоже стандартный.

На всех кнопках поменял, а вот как в этих местах изменить не могу понять.
Если кнопка на ботве и пример от wint56, то попробуй использовать BtnSetCursor(MusicButton, hcur), а как отобразить курсор на слайд-шоу - вопрос ...
 

Carlos

Участник
Модератор
Если кнопка на ботве и пример от wint56, то попробуй использовать BtnSetCursor(MusicButton, hcur), а как отобразить курсор на слайд-шоу - вопрос ...
А как это прописать если я использую модуль BASS и в скрипте у меня только

BASS_Init('{tmp}\Music.ogg') //Запускаем музыку
//BASS_Init(ExpandConstant('{tmp}\*')) //Можно добавить в инсталл несколько песен (Поиск по маске)
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', ScaleX(10), ScaleY(36), ScaleX(12), ScaleX(12), ScaleY(4)) //Создаем кнопку вкл/выкл

А на MusicButton ругается. Пишет, что не знает этого MusicButton
 

Shegorat

Lord of Madness
Администратор
Carlos
Там идентификатор кнопки BASS_OnOffBtn
Код:
//====================================== Музыка и кнопки ========================================//
BASS_Init('{tmp}\Music.ogg') //Запускаем музыку
//BASS_Init(ExpandConstant('{tmp}\*')); //Можно добавить в инсталл несколько песен (Поиск по маске)
BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', ScaleX(10), ScaleY(36), ScaleX(12), ScaleX(12), ScaleY(4)); //Создаем кнопку вкл/выкл
BtnSetCursor(BASS_OnOffBtn, hcur);
//====================================== Музыка и кнопки ========================================//
А насчет слайд-шоу, опять же, всё зависит от того, как реализовано.
 

vint56

Ветеран
Проверенный
ilyaign86
#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppExeName "MyProg.exe"

[Setup]
AppId={{008FA292-36BB-4298-8555-536EB672624D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=mysetup
Compression=lzma
SolidCompression=yes
;WizardStyle=modern

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"


[Files]
Source: "MyCursor.cur"; Flags: dontcopy

Код:
const
  GCL_HCURSOR = (-12);

var
  PathToCursorFile: string;
  Cursor: LongWord;

function LoadCursorFromFile(lpFileName: string): LongWord;
  external 'LoadCursorFromFileW@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
  external 'SetClassLongA@user32 stdcall';  

procedure SetControlsCursor(Control: TWinControl; Cursor: LongWord);
var
  I: Integer;
begin
  SetClassLong(Control.Handle, GCL_HCURSOR, Cursor);

  for I := 0 to Control.ControlCount - 1 do
  begin
    if Control.Controls[I] is TWinControl then
    begin
      SetControlsCursor(TWinControl(Control.Controls[I]), Cursor);
    end;
  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('MyCursor.cur')
  PathToCursorFile := ExpandConstant('{tmp}\MyCursor.cur');
  Cursor := LoadCursorFromFile(PathToCursorFile);
  SetControlsCursor(WizardForm, Cursor);
end;

#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppExeName "MyProg.exe"

[Setup]
AppId={{008FA292-36BB-4298-8555-536EB672624D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={autopf}\{#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=mysetup
Compression=lzma
SolidCompression=yes
WizardStyle=modern

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"


[Files]
Source: "MyCursor.cur"; Flags: dontcopy

Код:
const
  GCL_HCURSOR = (-12); 

function LoadCursorFromFile(lpFileName: string): LongWord;
  external 'LoadCursorFromFileW@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
  external 'SetClassLongA@user32 stdcall';   

procedure InitializeWizard();
var
  PathToCursorFile: string;
  Cursor: LongWord;
begin
  ExtractTemporaryFile('MyCursor.cur')
  PathToCursorFile := ExpandConstant('{tmp}\MyCursor.cur');
  Cursor := LoadCursorFromFile(PathToCursorFile);
  SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, Cursor); 
end;[/SPOILER]
 

ilyaign86

Новичок
ilyaign86
#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppExeName "MyProg.exe"

[Setup]
AppId={{008FA292-36BB-4298-8555-536EB672624D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=mysetup
Compression=lzma
SolidCompression=yes
;WizardStyle=modern

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"


[Files]
Source: "MyCursor.cur"; Flags: dontcopy

Код:
const
  GCL_HCURSOR = (-12);

var
  PathToCursorFile: string;
  Cursor: LongWord;

function LoadCursorFromFile(lpFileName: string): LongWord;
  external 'LoadCursorFromFileW@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
  external 'SetClassLongA@user32 stdcall'; 

procedure SetControlsCursor(Control: TWinControl; Cursor: LongWord);
var
  I: Integer;
begin
  SetClassLong(Control.Handle, GCL_HCURSOR, Cursor);

  for I := 0 to Control.ControlCount - 1 do
  begin
    if Control.Controls[I] is TWinControl then
    begin
      SetControlsCursor(TWinControl(Control.Controls[I]), Cursor);
    end;
  end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('MyCursor.cur')
  PathToCursorFile := ExpandConstant('{tmp}\MyCursor.cur');
  Cursor := LoadCursorFromFile(PathToCursorFile);
  SetControlsCursor(WizardForm, Cursor);
end;

#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppExeName "MyProg.exe"

[Setup]
AppId={{008FA292-36BB-4298-8555-536EB672624D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={autopf}\{#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=mysetup
Compression=lzma
SolidCompression=yes
WizardStyle=modern

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"


[Files]
Source: "MyCursor.cur"; Flags: dontcopy

Код:
const
  GCL_HCURSOR = (-12);

function LoadCursorFromFile(lpFileName: string): LongWord;
  external 'LoadCursorFromFileW@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
  external 'SetClassLongA@user32 stdcall';  

procedure InitializeWizard();
var
  PathToCursorFile: string;
  Cursor: LongWord;
begin
  ExtractTemporaryFile('MyCursor.cur')
  PathToCursorFile := ExpandConstant('{tmp}\MyCursor.cur');
  Cursor := LoadCursorFromFile(PathToCursorFile);
  SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, Cursor);
end;[/SPOILER]
Спасибо! Помогло, присоединил в Ботве. А при закрытии выгружать из памяти не надо?
 

Socolino

Новичок
Как сделать чтоб курсор отображался на всех окнах а не только на кнопках ?
 
Сверху