LCL: fix the bug in FindControlAtPosition(), issue #42062

This commit is contained in:
rich2014 2026-02-19 10:45:44 +08:00
parent 13ccaf0c22
commit 9239154fdb
2 changed files with 8 additions and 3 deletions

View File

@ -3429,14 +3429,19 @@ const
var
WinControl: TWinControl;
Control: TControl;
clientPos: TPoint;
flags: TControlAtPosFlags;
begin
Result := nil;
WinControl := FindLCLWindow(Position, AllowDisabled);
if Assigned(WinControl) then
begin
Result := WinControl;
Control := WinControl.ControlAtPos(WinControl.ScreenToClient(Position),
[capfAllowWinControls, capfRecursive] + DisabledFlag[AllowDisabled]);
clientPos := WinControl.ScreenToClient(Position);
clientPos.Offset(WinControl.GetClientScrollOffset());
flags := [capfAllowWinControls, capfRecursive, capfHasScrollOffset]
+ DisabledFlag[AllowDisabled];
Control := WinControl.ControlAtPos(clientPos, flags);
//debugln(['FindControlAtPosition ',dbgs(Position),' ',DbgSName(WinControl),' ',dbgs(WinControl.ScreenToClient(Position)),' ',DbgSName(Control)]);
if Assigned(Control) then
Result := Control;

View File

@ -5380,7 +5380,7 @@ begin
(TWinControl(Result).ControlCount > 0) then
begin
// in LCL ClientOrigin contains the scroll offset. At least this is so
// for win32 and gtk2
// for win32 and gtk2 and Cocoa
OldClientOrigin := ClientOrigin;
NewClientOrigin := TWinControl(Result).ClientOrigin;
NewPos := Pos;