【问题标题】:Calling SetGestureConfig method affects onmousemove override of control调用 SetGestureConfig 方法会影响控件的 onmousemove 覆盖
【发布时间】:2018-11-13 05:14:19
【问题描述】:

为了处理像捏合这样的触摸手势,我在WndProc 控件中调用了覆盖方法中的SetGestureConfig 方法。

我想将此方法仅用于捏合手势而不是 GC_ALLGESTURES。

这里是代码

            switch (m.Msg)
            {
                case WM_GESTURENOTIFY:
                    {
                    GESTURECONFIG gc = new GESTURECONFIG();
                    gc.dwID = 0;
                    gc.dwWant = GC_ALLGESTURES;
                    gc.dwBlock = 0;

                    bool result = SetGestureConfig(
                        handle,
                        0,
                        1,
                        ref gc,
                        _gestureConfigSize
                    );

                    if (!result)
                    {
                        throw new Exception("Error in execution of SetGestureConfig");
                    }
                }
                break;
                //... other codes if any
            }

在使用此代码之前,当我在控件上触摸和移动手指时,将调用控件的OnMouseMove 覆盖方法。但是用了这段代码之后,就不是这样了。

我正在分别处理与手势相关的功能,例如捏合、平移等,并且工作正常。

只有在捏合手势之后才能进行平移。如果在控件上执行了捏合手势,则应在触摸移动时执行平移。如果没有在控件上执行捏合手势,那么我希望在触摸移动期间触发默认的鼠标移动事件

但是调用SetGestureConfig方法,不会触发默认的鼠标移动事件。

我应该在没有捏合的平移手势期间手动调用OnMouseMove 吗?或者是否应该在调用SetGestureConfig 方法时进行任何修改以避免在平移手势期间阻塞OnMouseMove

【问题讨论】:

    标签: c# winforms onmousemove


    【解决方案1】:

    看起来我们可以控制我们想听的手势。参考https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setgestureconfig的备注部分

    在上面的代码中,我只需要进行以下更改以仅收听捏合手势和平移(仅在执行捏合之后)。变化通过cmets解释

                switch (m.Msg)
                {
                    case WM_GESTURENOTIFY:
                        {
                        GESTURECONFIG gc = new GESTURECONFIG();
    
                        //Listen to required gestures here
                        //If 0, all gestures like pinching, panning, etc will be listened
                        //If GID_ZOOM, only pinching gesture will be listened
                        gc.dwID = IsPinchingPerformed ? 0 : GID_ZOOM;
    
    
                        gc.dwWant = GC_ALLGESTURES;
                        gc.dwBlock = 0;
    
                        bool result = SetGestureConfig(
                            handle,
                            0,
                            1,
                            ref gc,
                            _gestureConfigSize
                        );
    
                    }
                    break;
    
                    //... other codes if any
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-24
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多