So wird das glaube ich bei VirtualTreeView gemacht.
Delphi-Quellcode:
procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL;
...
procedure TmyListView.CMMouseWheel(var Message: TCMMouseWheel);
var
ScrollAmount: Integer;
ScrollLines: DWORD;
RTLFactor: Integer;
WheelFactor: Double;
begin
inherited;
if Message.Result = 0 then
begin
with Message do
begin
Result := 1;
WheelFactor := WheelDelta / WHEEL_DELTA;
if (FRangeY > ClientHeight) and (not (ssShift in ShiftState)) then
begin
// Scroll vertically if there's something to scroll...
if ssCtrl in ShiftState then
ScrollAmount := Trunc(WheelFactor * ClientHeight)
else
begin
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @ScrollLines, 0);
if ScrollLines = WHEEL_PAGESCROLL then
ScrollAmount := Trunc(WheelFactor * ClientHeight)
else
ScrollAmount := Integer(Trunc(WheelFactor * ScrollLines * FRowHeight / 10));
end;
SetOffsetY(FOffsetY + ScrollAmount);
UpdateVerticalScrollBar(True);
end
else
begin
// ...else scroll horizontally if there's something to scroll.
if UseRightToLeftAlignment then
RTLFactor := -1
else
RTLFactor := 1;
if ssCtrl in ShiftState then
ScrollAmount := Trunc(WheelFactor * (ClientWidth {- FHeader.Columns.GetVisibleFixedWidth}))
else
begin
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @ScrollLines, 0);
if ScrollLines = WHEEL_PAGESCROLL then
ScrollAmount := Trunc(WheelFactor * (ClientWidth {- FHeader.Columns.GetVisibleFixedWidth}))
else
ScrollAmount := Trunc(WheelFactor * ScrollLines * FColWidth / 10{FHeader.Columns.GetScrollWidth});
end;
SetOffsetX(FOffsetX + RTLFactor * ScrollAmount);
end;
end;
end;
end;