最近在做Multitouch的demo应用,其中有个白板的demo,尝试了使用WPF的InkCanvas。
(以前真没有做过.Net开发,可能我写的东西很幼稚)
下面的代码片段就是接收来自MultiTouch的消息,转化为InkCanvas的Stroke。
由于Touch的接收是在另外一个线程,它不能直接访问UI线程里面的托管对象,所以需要通过特殊的方式来更新InkCanvas。
    public struct NewCursor
    {
        public StylusPointCollection spc;
        public Stroke stroke;
    }
 public partial class InkPadWindow : TuioListener
 {
        ....... 一些其他的处理函数
        private Dictionary<long, NewCursor> spcList = new Dictionary<long, NewCursor>(32);
        private delegate void updateStrokeDelegate(TuioCursor tcur, int action);
        public void addStroke(TuioCursor tcur, int action)
        {
            if (action == 0)
            {
                NewCursor nc = new NewCursor();
                StylusPointCollection spc = new StylusPointCollection();
                StylusPoint sp = new StylusPoint(tcur.getX() * 1280, tcur.getY() * 800, (float)0.5);
                spc.Add(sp);
                Stroke newStroke = new Stroke(spc, inkCanv.DefaultDrawingAttributes.Clone());
                //绘画过程中,先不让Stroke自动平滑
                newStroke.DrawingAttributes.FitToCurve = false;
                inkCanv.Strokes.Add(newStroke);
                nc.spc = spc;
                nc.stroke = newStroke;
                spcList.Add(tcur.getSessionID(), nc);
            }
            else if (action == 1)
            {
                StylusPointCollection spc = spcList[tcur.getSessionID()].spc;
                StylusPoint sp = new StylusPoint(tcur.getX() * 1280, tcur.getY() * 800, (float)0.5);
                spc.Add(sp);
                Trace.Write("add stylus point:" + tcur.getX().ToString() + "," + tcur.getY().ToString() + "\n");
            }
            else if (action == 2)
            {
                StylusPointCollection spc = spcList[tcur.getSessionID()].spc;
                StylusPoint sp = new StylusPoint(tcur.getX() * 1280, tcur.getY() * 800, (float)0.5);
                spc.Add(sp);
 
                //画完以后,设置FitToCurve让这个Stroke平滑。
                spcList[tcur.getSessionID()].stroke.DrawingAttributes.FitToCurve = true;
                spcList.Remove(tcur.getSessionID());
                Trace.Write("add stylus point:" + tcur.getX().ToString() + "," + tcur.getY().ToString() + "\n");
            }
          
        }
 
       //接收Cursor Press 的事件接口函数
        public void addTuioCursor(TuioCursor tcur)
        {
            try
            {
                inkCanv.Dispatcher.Invoke(DispatcherPriority.Normal, new updateStrokeDelegate(addStroke), tcur, 0);
            }
            catch (Exception e)
            {
                Trace.Write("exception in addCursor\n");
                Trace.Write(e.Message);
            }
            Trace.Write("cursor add\n");
        }
 
        //接收Cursor move的事件接口
        public void updateTuioCursor(TuioCursor tcur)
        {
            try
            {
                inkCanv.Dispatcher.Invoke(DispatcherPriority.Normal, new updateStrokeDelegate(addStroke), tcur, 1);
            }
            catch (Exception e)
            {
                Trace.Write(e.Message);
            }
            Trace.Write("cursor update\n");
        }
 
        //接收Cursor Release的事件接口
        public void removeTuioCursor(TuioCursor tcur)
        {
            try
            {
                inkCanv.Dispatcher.Invoke(DispatcherPriority.Normal, new updateStrokeDelegate(addStroke), tcur, 2);
            }
            catch (Exception e)
            {
                Trace.Write(e.Message);
            }
            Trace.Write("cursor remove\n");
        }
}