win32: proper fix for issue #25209. Correctly detect what LCL control is under the cursor.

git-svn-id: trunk@47049 -
This commit is contained in:
blikblum 2014-12-01 18:18:40 +00:00
parent 1ad0f9600a
commit bcab8ad0c3

View File

@ -215,6 +215,30 @@ begin
DisposeWindowInfo(Buddy); DisposeWindowInfo(Buddy);
end; end;
function GetLCLWindowFromPoint(BaseControl: TControl; const Point: TPoint): HWND;
var
ParentForm: TCustomForm;
ParentRect: TRect;
TheControl: TControl;
begin
Result := 0;
ParentForm := GetParentForm(BaseControl);
if ParentForm <> nil then
begin
TheControl := ParentForm.ControlAtPos(ParentForm.ScreenToClient(Point), [capfAllowDisabled, capfAllowWinControls,
capfRecursive, capfHasScrollOffset]);
if TheControl is TWinControl then
Result := TWinControlAccess(TheControl).WindowHandle;
if Result = 0 then
begin
ParentRect := Rect(ParentForm.Left, ParentForm.Top,
ParentForm.Left + ParentForm.Width, ParentForm.Top + ParentForm.Height);
if PtInRect(ParentRect, Point) then
Result := ParentForm.Handle;
end;
end;
end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------
Function: WindowProc Function: WindowProc
Params: Window - The window that receives a message Params: Window - The window that receives a message
@ -1862,17 +1886,18 @@ begin
// window the mouse is hovering over // window the mouse is hovering over
P.X := X; P.X := X;
P.Y := Y; P.Y := Y;
TargetWindow := TWin32WidgetSet(WidgetSet).WindowFromPoint(P);
TargetWindow := Win32WidgetSet.WindowFromPoint(P);
//fallback to LCL function to get the actual window
if TargetWindow = 0 then if TargetWindow = 0 then
TargetWindow := Window; TargetWindow := GetLCLWindowFromPoint(lWinControl, P);
if (TargetWindow = 0) or not IsWindowEnabled(TargetWindow) then if (TargetWindow = 0) or not IsWindowEnabled(TargetWindow) then
exit; exit;
// check if the window is an edit control of a combobox, if so, // check if the window is an edit control of a combobox, if so,
// redirect it to the combobox, not the edit control // redirect it to the combobox, not the edit control
if GetWin32WindowInfo(TargetWindow)^.isComboEdit then if WindowInfo^.isComboEdit then
TargetWindow := Windows.GetParent(TargetWindow); TargetWindow := Windows.GetParent(TargetWindow);
// check InMouseWheelRedirection to prevent recursion // check InMouseWheelRedirection to prevent recursion