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); }
public static extern bool GetPointerPenInfo(uint pointerId, [In, Out] ref POINTER_PEN_INFO penInfo);
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; } }