diff --git a/lcl/controls.pp b/lcl/controls.pp index 73737fd624..efbd5d73cd 100644 --- a/lcl/controls.pp +++ b/lcl/controls.pp @@ -1449,7 +1449,7 @@ type capfAllowWinControls,// include TWinControls capfOnlyClientAreas, // use the client areas, not the whole child area capfRecursive, // search recursively in grand childrens - capfNoScrolling // do not add the scroll offset to Pos + capfHasScrollOffset // do not add the scroll offset to Pos (already included) ); TControlAtPosFlags = set of TControlAtPosFlag; diff --git a/lcl/include/wincontrol.inc b/lcl/include/wincontrol.inc index 162abf4c8e..40dd4590ca 100644 --- a/lcl/include/wincontrol.inc +++ b/lcl/include/wincontrol.inc @@ -3259,6 +3259,16 @@ begin // check if Pos in visible client area ClientBounds:=GetClientRect; + ScrolledOffset:=GetClientScrollOffset; + if capfHasScrollOffset in Flags then + begin + { ClientBounds do not include scrolling offset } + inc(ClientBounds.Left, ScrolledOffset.x); + inc(ClientBounds.Right, ScrolledOffset.x); + inc(ClientBounds.Top, ScrolledOffset.y); + inc(ClientBounds.Bottom, ScrolledOffset.y); + end; + if not PtInRect(ClientBounds,Pos) then begin //debugln(['TWinControl.ControlAtPos OUT OF CLIENTBOUNDS ',DbgSName(Self),' P=',dbgs(Pos),' ClientBounds=',dbgs(ClientBounds)]); //DumpStack; @@ -3268,8 +3278,7 @@ begin // map Pos to logical client area P:=Pos; - if not (capfNoScrolling in Flags) then begin - ScrolledOffset:=GetClientScrollOffset; + if not (capfHasScrollOffset in Flags) then begin inc(P.X,ScrolledOffset.X); inc(P.Y,ScrolledOffset.Y); end; @@ -3295,7 +3304,7 @@ begin NewPos:=Pos; NewPos.X:=NewPos.X-NewClientOrigin.X+OldClientOrigin.X; NewPos.Y:=NewPos.Y-NewClientOrigin.Y+OldClientOrigin.Y; - LControl:=TWinControl(Result).ControlAtPos(NewPos,Flags-[capfNoScrolling]); + LControl:=TWinControl(Result).ControlAtPos(NewPos,Flags-[capfHasScrollOffset]); //debugln(['TWinControl.RECURSED ControlAtPos Result=',DbgSName(Result),' LControl=',DbgSName(LControl),' ',dbgs(NewPos),' AllowDisabled=',AllowDisabled,' OnlyClientAreas=',OnlyClientAreas]); if LControl<>nil then Result:=LControl; diff --git a/lcl/interfaces/win32/win32callback.inc b/lcl/interfaces/win32/win32callback.inc index cf5c4353ad..49ad6d432a 100644 --- a/lcl/interfaces/win32/win32callback.inc +++ b/lcl/interfaces/win32/win32callback.inc @@ -698,7 +698,8 @@ Var if ACursor = crDefault then begin // statictext controls do not get WM_SETCURSOR messages... - lControl := lWinControl.ControlAtPos(P, false, true); + lControl := lWinControl.ControlAtPos(P, [capfOnlyClientAreas, + capfAllowWinControls, capfHasScrollOffset]); if lControl = nil then lControl := lWinControl; if lControl.Cursor <> crDefault then