/
TouchPadScroll.cs
52 lines (44 loc) · 1.67 KB
/
TouchPadScroll.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
namespace Microsoft.Research.DynamicDataDisplay.Navigation
{
/// <summary>This class allows convenient navigation around viewport using touchpad on
/// some notebooks</summary>
public sealed class TouchpadScroll : NavigationBase {
public TouchpadScroll() {
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e) {
WindowInteropHelper helper = new WindowInteropHelper(Window.GetWindow(this));
HwndSource source = HwndSource.FromHwnd(helper.Handle);
source.AddHook(OnMessageAppeared);
}
private IntPtr OnMessageAppeared(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
if (msg == WindowsMessages.WM_MOUSEWHEEL) {
Point mousePos = MessagesHelper.GetMousePosFromLParam(lParam);
mousePos = TranslatePoint(mousePos, this);
if (Viewport.Output.Contains(mousePos)) {
MouseWheelZoom(MessagesHelper.GetMousePosFromLParam(lParam), MessagesHelper.GetWheelDataFromWParam(wParam));
handled = true;
}
}
return IntPtr.Zero;
}
double wheelZoomSpeed = 1.2;
public double WheelZoomSpeed {
get { return wheelZoomSpeed; }
set { wheelZoomSpeed = value; }
}
private void MouseWheelZoom(Point mousePos, int wheelRotationDelta) {
Point zoomTo = mousePos.ScreenToData(Viewport.Transform);
double zoomSpeed = Math.Abs(wheelRotationDelta / Mouse.MouseWheelDeltaForOneLine);
zoomSpeed *= wheelZoomSpeed;
if (wheelRotationDelta < 0) {
zoomSpeed = 1 / zoomSpeed;
}
Viewport.Visible = Viewport.Visible.Zoom(zoomTo, zoomSpeed);
}
}
}