2016-05-20 6 views
1

Ist es möglich, OnMouseHover Ereignis (um eine Funktion aufzurufen, wenn die Maus über ein Inno-Setup-Steuerelement ist) für Inno-Setup-Steuerelemente zu simulieren, oder gibt es eine DLL-Bibliothek, die helfen kann?Inno Setup: OnHover-Ereignis

Antwort

1

Sie können es implementieren durch:

  • Planen einer sehr häufigen Timer (etwa 50 ms) mit dem InnoCallback DLL
  • , wenn der Timer ausgelöst wird, finden sie eine Kontrolle über die der Cursor positioniert ist, und nach Änderungen suchen.

Das folgende Beispiel zeigt Namen des Steuerelements mit Cursor darauf auf einem Etikett, wie:

enter image description here

[Files] 
Source: InnoCallback.dll; Flags: dontcopy 

[Code] 

var 
    HoverLabel:TLabel; 
    LastMouse: TPoint; 
    LastHoverControl: TControl; 

type 
    TTimerProc = procedure(H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord); 

function GetCursorPos(var lpPoint: TPoint): BOOL; 
    external '[email protected] stdcall'; 
function SetTimer(hWnd: longword; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): 
    LongWord; external '[email protected] stdcall'; 
function ScreenToClient(hWnd: HWND; var lpPoint: TPoint): BOOL; 
    external '[email protected] stdcall'; 
function ClientToScreen(hWnd: HWND; var lpPoint: TPoint): BOOL; 
    external '[email protected] stdcall'; 

function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord; 
    external '[email protected]:innocallback.dll stdcall'; 

function FindControl(Parent: TWinControl; P: TPoint): TControl; 
var 
    Control: TControl; 
    WinControl: TWinControl; 
    I: Integer; 
    P2: TPoint; 
begin 
    for I := 0 to Parent.ControlCount - 1 do 
    begin 
    Control := Parent.Controls[I]; 
    if Control.Visible and 
     (Control.Left <= P.X) and (P.X < Control.Left + Control.Width) and 
     (Control.Top <= P.Y) and (P.Y < Control.Top + Control.Height) then 
    begin 
     if Control is TWinControl then 
     begin 
     P2 := P; 
     ClientToScreen(Parent.Handle, P2); 
     WinControl := TWinControl(Control); 
     ScreenToClient(WinControl.Handle, P2); 
     Result := FindControl(WinControl, P2); 
     if Result <> nil then Exit; 
     end; 

     Result := Control; 
     Exit; 
    end; 
    end; 

    Result := nil; 
end; 

procedure HoverControlChanged(Control: TControl); 
begin 
    if Control = nil then 
    begin 
    HoverLabel.Caption := 'no control'; 
    end 
    else 
    begin 
    HoverLabel.Caption := Control.Name; 
    end; 
end; 

procedure HoverTimerProc(H: LongWord; Msg: LongWord; IdEvent: LongWord; Time: LongWord); 
var 
    P: TPoint; 
    Control: TControl; 
begin 
    GetCursorPos(P); 
    if P <> LastMouse then { just optimization } 
    begin 
    LastMouse := P; 
    ScreenToClient(WizardForm.Handle, P); 

    if (P.X < 0) or (P.Y < 0) or 
     (P.X > WizardForm.ClientWidth) or (P.Y > WizardForm.ClientHeight) then 
    begin 
     Control := nil; 
    end 
     else 
    begin 
     Control := FindControl(WizardForm, P); 
    end; 

    if Control <> LastHoverControl then 
    begin 
     HoverControlChanged(Control); 
     LastHoverControl := Control; 
    end; 
    end; 
end; 

procedure InitializeWizard(); 
var 
    HoverTimerCallback: LongWord; 
begin 
    HoverTimerCallback := WrapTimerProc(@HoverTimerProc, 4); 

    SetTimer(0, 0, 50, HoverTimerCallback); 

    HoverLabel := TLabel.Create(WizardForm); 
    HoverLabel.Left := ScaleX(8); 
    HoverLabel.Top := WizardForm.ClientHeight - ScaleY(32); 
    HoverLabel.Parent := WizardForm; 
    HoverLabel.Caption := 'starting'; 
end; 
0

Der folgende Code stammt aus der Dokumentation von Inno Unicode Enhanced Ver. Wie Sie die OnMouseEnter & OnMouseLeave-Funktionen sehen können, können Sie sie verwenden, um Ihre OnHover-Funktion zu implementieren.

TButton = class(TButtonControl) 
    procedure Click; 
    property OnMouseEnter: TNotifyEvent; read write; 
    property OnMouseLeave: TNotifyEvent; read write; 
    end; 
+0

Verbesserte vER (chinesisch/russisch) gezwickt und nicht offizielle (= nicht unterstützt) Version von Inno Setup? – Slappy

+0

Ich benutze es seit etwa 5 Jahren. Es hat bessere Funktionalität und es ist auch in Englisch: D –