그래서 적용하는 방법은...
TScrollBox을 품고 있는 폼의 MouseWheel 이벤트에
if WheelDelta >= 0 then
SendMessage(scBox.Handle, WM_VSCROLL, SB_LINELEFT, 0)
else
SendMessage(scBox.Handle, WM_VSCROLL, SB_LINERIGHT, 0);
Handled := True;
을 하면 되는데, 다른 컨트롤에 스크롤이 있는경우 모든 스크롤 이벤트를 가로체서 해당 컨트롤에 까지 닫지 않는다.
WindowFromPoint(p: TPoint) 를 이용해서 마우스 커서에 올려져 있는 컨트롤이 TScrollBox인지 스크롤 다른건지 확인해서 넘겨준다.
procedure TForm1.Form1MouseWheel(Sender: TObject;
var Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
var Handled: Boolean);
h: HWND;
if (h <> vtProc.Handle) and (h <> vtList.Handle) then
if WheelDelta >= 0 then
begin
h := WindowFromPoint(MousePos);
if (h <> vtProc.Handle) and (h <> vtList.Handle) then
h := scBox.Handle;
if WheelDelta >= 0 then
SendMessage(h, WM_VSCROLL, SB_LINELEFT, 0)
else
SendMessage(h, WM_VSCROLL, SB_LINERIGHT, 0); Handled := True;
end;
이런식으로 폼 MouseWheel 이벤트에 추가해주면 장점이 있는데,
스크롤 할 컨트롤을 굳이 클릭해서 포커스를 주지 않아도 마우스 휠만으로 스크롤이 가능하다는 것이다.
끝.