2016-05-20 32 views

回答

1

您可以通过实现它:

  • 调度非常频繁计时器(比如50毫秒)使用InnoCallback DLL
  • 计时器被触发时,发现一个控制哪些光标定位并检查更改。

以下示例显示与光标在它的控制的名称的标签上,如:

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

以下代码来自Inno Unicode Enhanced Ver。的文档。正如你所看到的OnMouseEnter & OnMouseLeave函数,你可以使用它们来实现你的OnHover函数。

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

增强版是(中国/俄语)调整和非官方(=不受支持) Inno Setup版本? – Slappy

+0

我一直在使用它约5年。它有更好的功能和它的英文:D –