From e9c686e8043571be9e537005d4eeaa596274cd3e Mon Sep 17 00:00:00 2001 From: ondrej Date: Thu, 24 Mar 2016 15:24:14 +0000 Subject: [PATCH] win32: forward unhandled mousewheel messages to parent in order to support scrolling when mouse cursor is on child wincontrol. git-svn-id: trunk@52045 - --- lcl/forms.pp | 1 - lcl/include/scrollingwincontrol.inc | 12 ----------- lcl/interfaces/win32/win32winapi.inc | 31 +++++++++++++++++++++++----- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/lcl/forms.pp b/lcl/forms.pp index ec28a4e724..e7400f5c0e 100644 --- a/lcl/forms.pp +++ b/lcl/forms.pp @@ -168,7 +168,6 @@ type procedure WMSize(var Message: TLMSize); message LM_Size; procedure WMHScroll(var Message : TLMHScroll); message LM_HScroll; procedure WMVScroll(var Message : TLMVScroll); message LM_VScroll; - procedure WMMouseWheel(var Message: TLMMouseEvent); message LM_MOUSEWHEEL; procedure ComputeScrollbars; virtual; procedure SetAutoScroll(Value: Boolean); virtual; procedure Loaded; override; diff --git a/lcl/include/scrollingwincontrol.inc b/lcl/include/scrollingwincontrol.inc index dbc678735f..16ac326337 100644 --- a/lcl/include/scrollingwincontrol.inc +++ b/lcl/include/scrollingwincontrol.inc @@ -304,18 +304,6 @@ begin HorzScrollbar.ScrollHandler(Message); end; -procedure TScrollingWinControl.WMMouseWheel(var Message: TLMMouseEvent); -begin - // support VertScrollBar.Increment on Windows. - // The code has no meaning on other OS because scrolling is handled there directly by the OS - if Mouse.WheelScrollLines > 0 then - Message.WheelDelta := - (Min(High(Message.WheelDelta), Max(Low(Message.WheelDelta), - (VertScrollBar.Increment * Message.WheelDelta))) div 120) * 120; - - inherited WMMouseWheel(Message); -end; - constructor TScrollingWinControl.Create(TheOwner : TComponent); begin Inherited Create(TheOwner); diff --git a/lcl/interfaces/win32/win32winapi.inc b/lcl/interfaces/win32/win32winapi.inc index 7b5f755b13..4891224c67 100644 --- a/lcl/interfaces/win32/win32winapi.inc +++ b/lcl/interfaces/win32/win32winapi.inc @@ -165,6 +165,10 @@ var ScrollMsg, ScrollBar: dword; ScrollOffset: integer; Pos: TPoint; + MouseMessage: TLMMouseEvent; + SW: TScrollingWinControl; + SB: TControlScrollBar; + ScrollWheelDelta: LongInt; begin if not TWinControl(Sender).HandleAllocated then exit; @@ -208,15 +212,30 @@ var ScrollBar := SB_VERT; ScrollMsg := WM_VSCROLL; end; - if Windows.GetScrollInfo(Handle, ScrollBar, ScrollInfo) then + if Windows.GetScrollInfo(Handle, ScrollBar, ScrollInfo) + and (Int64(ScrollInfo.nPage) < Int64(ScrollInfo.nMax)) then begin - with TLMMouseEvent(Message) do + MouseMessage := TLMMouseEvent(Message); begin if Mouse.WheelScrollLines < 0 then // -1 means, scroll one page - ScrollOffset := (WheelDelta * integer(ScrollInfo.nPage)) div 120 + ScrollOffset := (MouseMessage.WheelDelta * integer(ScrollInfo.nPage)) div 120 else - ScrollOffset := (WheelDelta * Mouse.WheelScrollLines) div 120; + if Sender is TScrollingWinControl then // support scrollbar increment + begin + SW := TScrollingWinControl(Sender); + if ScrollBar = SB_Horz then + SB := SW.HorzScrollBar + else + SB := SW.VertScrollBar; + ScrollWheelDelta := + (Min(High(MouseMessage.WheelDelta), Max(Low(MouseMessage.WheelDelta), + (SB.Increment * MouseMessage.WheelDelta))) div 120) * 120; + end else + ScrollWheelDelta := MouseMessage.WheelDelta; + begin + ScrollOffset := (ScrollWheelDelta * Mouse.WheelScrollLines) div 120; + end; WParam := Windows.WParam(ScrollInfo.nPos - ScrollOffset); if WParam > ScrollInfo.nMax - integer(ScrollInfo.nPage) + 1 then WParam := ScrollInfo.nMax - integer(ScrollInfo.nPage) + 1; @@ -225,7 +244,9 @@ var WParam := SB_THUMBPOSITION or (WParam shl 16); end; Windows.PostMessage(Handle, ScrollMsg, WParam, HWND(nil)); - end; + end else + if (TControl(Sender).Parent <> nil) then + TControl(Sender).Parent.WindowProc(TLMessage(Message)); end; begin