Beispiel #1
0
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            bool             ret;
            uint             pointId;
            PointerInputType inputType = PointerInputType.PEN;
            POINTER_PEN_INFO penInfo   = new POINTER_PEN_INFO();

            switch (msg)
            {
            case API.WM_POINTERENTER:
            case API.WM_POINTERUPDATE:
            case API.WM_POINTERDOWN:
            case API.WM_POINTERUP:
            case API.WM_POINTERLEAVE:
                pointId = API.GET_POINTERID_WPARAM((uint)wParam.ToInt32());
                ret     = API.GetPointerType(pointId, ref inputType);
                if (!ret)
                {
                    break;
                }

                if (inputType == PointerInputType.PEN)
                {
                    ret = API.GetPointerPenInfo(pointId, ref penInfo);
                    if (!ret)
                    {
                        break;
                    }

                    ProcessPenPoint(msg, penInfo,
                                    API.GET_X_LPARAM((uint)lParam.ToInt32()),
                                    API.GET_Y_LPARAM((uint)lParam.ToInt32()));
                }
                handled = true;
                break;

            default:
                break;
            }
            return(IntPtr.Zero);
        }
Beispiel #2
0
 public static extern bool GetPointerPenInfo(uint pointerId, [In, Out] ref POINTER_PEN_INFO penInfo);
Beispiel #3
0
        private void ProcessPenPoint(int msg, POINTER_PEN_INFO penInfo, uint x, uint y)
        {
            Point pt       = this.PointFromScreen(new Point(x, y));
            float pressure = penInfo.pressure;

            pressure /= 1024;
            StylusPoint sp = new StylusPoint(pt.X, pt.Y, pressure);

            switch (msg)
            {
            case API.WM_POINTERENTER:
                if ((penInfo.penFlags & PenFlags.ERASER) > 0 ||
                    (penInfo.penFlags & PenFlags.INVERTED) > 0)
                {
                    inkCanvas1.EditingMode = InkCanvasEditingMode.EraseByStroke;
                }
                else
                {
                    inkCanvas1.EditingMode = InkCanvasEditingMode.Ink;
                }
                break;

            case API.WM_POINTERDOWN:
                isDown = true;
                if (inkCanvas1.EditingMode == InkCanvasEditingMode.Ink)
                {
                    stroke = new Stroke(new StylusPointCollection(new StylusPoint[] { sp }), inkCanvas1.DefaultDrawingAttributes);
                    inkCanvas1.Strokes.Add(stroke);
                }
                else if (inkCanvas1.EditingMode == InkCanvasEditingMode.EraseByStroke)
                {
                    points = new List <Point>();
                    points.Add(pt);
                }
                break;

            case API.WM_POINTERUPDATE:
                if (isDown)
                {
                    if (inkCanvas1.EditingMode == InkCanvasEditingMode.Ink)
                    {
                        stroke.StylusPoints.Add(sp);
                    }
                    else if (inkCanvas1.EditingMode == InkCanvasEditingMode.EraseByStroke)
                    {
                        points.Add(pt);
                        StrokeCollection sc = inkCanvas1.Strokes.HitTest(points, inkCanvas1.EraserShape);
                        inkCanvas1.Strokes.Remove(sc);
                    }
                }
                break;

            case API.WM_POINTERUP:
                isDown = false;
                if (inkCanvas1.EditingMode == InkCanvasEditingMode.Ink)
                {
                    stroke.StylusPoints.Add(sp);
                }
                break;
            }
        }