int delta = GET_WHEEL_DELTA_WPARAM(wParam);
UINT scrollLines = 3;
SystemParametersInfoW(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, 0);
// 2. If Shift is held down, handle horizontal scrolling
if (LOWORD(wParam) & MK_SHIFT)
{
if (scrollLines == (UINT)WHEEL_PAGESCROLL)
{
SendMessageW(hwnd, WM_HSCROLL, (delta > 0) ? SB_PAGELEFT : SB_PAGERIGHT, 0);
}
else
{
for (UINT i = 0; i < scrollLines; ++i)
SendMessageW(hwnd, WM_HSCROLL, (delta > 0) ? SB_LINELEFT : SB_LINERIGHT, 0);
}
return 0;
}
// 3. Normal scrolling (No Ctrl, No Shift) -> Instant vertical scroll
else
{
if (scrollLines == (UINT)WHEEL_PAGESCROLL)
{
SendMessageW(hwnd, WM_VSCROLL, (delta > 0) ? SB_PAGEUP : SB_PAGEDOWN, 0);
}
else
{
for (UINT i = 0; i < scrollLines; ++i)
SendMessageW(hwnd, WM_VSCROLL, (delta > 0) ? SB_LINEUP : SB_LINEDOWN, 0);
}
return 0;
}
}
case WM_MOUSEHWHEEL:
{
int delta = GET_WHEEL_DELTA_WPARAM(wParam);
UINT scrollChars = 3;
SystemParametersInfoW(SPI_GETWHEELSCROLLCHARS, 0, &scrollChars, 0);
if (delta != 0)
{
for (UINT i = 0; i < scrollChars; ++i)
SendMessageW(hwnd, WM_HSCROLL, (delta > 0) ? SB_LINERIGHT : SB_LINELEFT, 0);
return 0;
}
break;
}
case WM_MOUSEWHEEL:
{
// 1. If Ctrl is held down, do nothing here and break out.
// This lets Windows/RichEdit handle the zooming animation normally.
if (LOWORD(wParam) & MK_CONTROL)
{
break;
}