So dachte ich das ja.
Die ScrollBox finde ich auch. Sie erhält aber das Scrollereignis nicht (auch mit Perform nicht)!?
Ich bin mit den Messages nicht so vertraut und kann nicht erkennen, wo es da klemmt:
Delphi-Quellcode:
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.MessageEvent(var Msg: TMsg; var Handled: Boolean);
Var
H: HWND;
C: TControl;
WC: TWinControl;
function GetParentScrollBox(WC: TWinControl): TWinControl;
begin
Result := WC;
if (not (WC is TScrollBox)) and (WC.Parent <> nil) then
Result := GetParentScrollBox(WC.Parent);
end;
begin
if ((Msg.Message = WM_MOUSEWHEEL) or (Msg.Message = WM_MOUSEHWHEEL)) and (Msg.wParam and MK_CONTROL = 0) then
begin
H := WindowFromPoint(Msg.Pt);
C := FindControl(H);
if C is TWinControl then
begin
WC := GetParentScrollBox(C as TWinControl);
if WC <> nil then
begin
// WC.Perform(Msg.Message, Msg.wParam, Msg.lParam);
// H := 0;
H := WC.Handle;
end;
end;
if (H = 0) or ((Msg.HWND <> H) and (GetWindowThreadProcessId(H, nil) <> GetCurrentThreadId)) then
begin
Msg.HWND := 0;
Msg.message := WM_NULL;
Handled := True;
end
else
Msg.HWND := H;
end;
end;
procedure TForm1.ScrollBox1MouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
(Sender as TScrollBox).VertScrollBar.Position := (Sender as TScrollBox).VertScrollBar.Position + Mouse.WheelScrollLines;
end;
procedure TForm1.ScrollBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
(Sender as TScrollBox).VertScrollBar.Position := (Sender as TScrollBox).VertScrollBar.Position - Mouse.WheelScrollLines;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MessageEvent;
end;