Adicionando Mouse Wheel no TScrollBox
Uma forma simples tratar Mouse Wheel no TScrollBox.
O código a seguir foi escrito pelo Peter Bellow no newsgroup
embarcadero.public.delphi.vcl.components.using
Eu postei aqui o código com uma pequena correção, o SB_LINEDOWN/SB_LINEUP estavam invertidos, e outras modificações pra adaptar ao meu código.
procedure TFormEquifaxMain.ScrollBoxMouseWheel(Sender: TObject;
Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var
Handled: Boolean);
var
Msg: Cardinal;
Code: Cardinal;
I, ScrollLines: Integer;
begin
if WindowFromPoint(Mouse.Cursorpos) = ScrollBox.Handle then
begin
Handled := True;
Msg:= IfThen(ssShift in Shift, WM_HSCROLL, WM_VSCROLL);
Code:= IfThen(WheelDelta < 0, SB_LINEDOWN, SB_LINEUP);
ScrollLines:= Mouse.WheelScrollLines * 5;
for I:= 1 to ScrollLines do
ScrollBox.Perform(Msg, Code, 0);
ScrollBox.Perform(Msg, SB_ENDSCROLL, 0);
end;
end;

1 Comments
Olá Cesar,
Eu tenho vários componentes scrollbox no form, então eu alterei a sua dica para funcionar em qualquer um deles. Obrigado pela dica e segue o código:
procedure TfrmMain.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
Msg: Cardinal;
Code: Cardinal;
I, ScrollLines: Integer;
WinCtrl: TWinControl;
begin
WinCtrl := FindVCLWindow(Mouse.CursorPos);
while (WinCtrl nil) and not (WinCtrl is TScrollBox) do
begin
WinCtrl := WinCtrl.Parent;
end;
if WindowFromPoint(Mouse.Cursorpos) = WinCtrl.Handle then
begin
Handled := True;
Msg := IfThen(ssShift in Shift, WM_HSCROLL, WM_VSCROLL);
Code := IfThen(WheelDelta < 0, SB_LINEDOWN, SB_LINEUP);
ScrollLines := Mouse.WheelScrollLines * 5;
for I:= 1 to ScrollLines do
begin
WinCtrl.Perform(Msg, Code, 0);
end;
WinCtrl.Perform(Msg, SB_ENDSCROLL, 0);
end;
end;