walterlv / BlogComments

3 stars 0 forks source link

post/handle-horizontal-scrolling-of-touchpad-en #102

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

Support Horizontal Scrolling of TouchPad in WPF Application - walterlv

Support Horizontal Scrolling of TouchPad in WPF Application

https://blog.walterlv.com/post/handle-horizontal-scrolling-of-touchpad-en.html

t3brown commented 2 years ago

Thanks! My horizontal scroll bar control:

    private void OnMouseTilt(int tilt)
    {
        UIElement element = Mouse.DirectlyOver as UIElement;

        if (element == null) return;

        ScrollViewer scrollViewer = element is ScrollViewer viewer ? viewer : FindParent<ScrollViewer>(element);

        if (scrollViewer == null)
            return;

        scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + tilt);
    }

    public static T FindParent<T>(DependencyObject child) where T : DependencyObject
    {
        DependencyObject parentObject = VisualTreeHelper.GetParent(child);

        if (parentObject == null) return null;

        T parent = parentObject as T;
        if (parent != null)
            return parent;
        else
            return FindParent<T>(parentObject);
    }
walterlv commented 2 years ago

Hahaha, that's great!

JeffersonQin commented 2 years ago

您好,我前面发现HIWORD中的.ToInt32在左滑的时候会算术溢出。我查了Win32API的文档,发现官方说应该用GET_WHEEL_DELTA_WPARAM来获取Delta。

walterlv commented 2 years ago

您好,我前面发现HIWORD中的.ToInt32在左滑的时候会算术溢出。我查了Win32API的文档,发现官方说应该用GET_WHEEL_DELTA_WPARAM来获取Delta。

@JeffersonQin 感谢,我修一下

JeffersonQin commented 2 years ago

@walterlv 我前面又看了下官方的macro实现发现和您的写法一样,所以感觉和GET_WHEEL_DELTA_WPARAM没关系,好像是wParam的位数问题。可能要判断是32位还是64位系统,然后用.ToInt32和.ToInt64分别做。

JeffersonQin commented 2 years ago

@walterlv 然后int转short的时候貌似需要unchecked context

JeffersonQin commented 2 years ago
/// <summary>
/// 取指针所在高位数值。
/// </summary>
private static int HIWORD(IntPtr ptr)
{
    unchecked
    {
        if (Environment.Is64BitOperatingSystem)
        {
            var val64 = ptr.ToInt64();
            return (short) ((val64 >> 16) & 0xFFFF);
        }
        var val32 = ptr.ToInt32();
        return (short) ((val32 >> 16) & 0xFFFF);   
    }
}

/// <summary>
/// 取指针所在低位数值。
/// </summary>
private static int LOWORD(IntPtr ptr)
{
    unchecked
    {
        if (Environment.Is64BitOperatingSystem)
        {
            var val64 = ptr.ToInt64();
            return (short)(val64 & 0xFFFF);
        }

        var val32 = ptr.ToInt32();
        return (short)(val32 & 0xFFFF);
    }
}

这样就可以了。