DrawTool画笔之图形笔

相关知识参考DrawTool画笔之纹理笔  , 图形笔的实现跟纹理笔的实现是一样的,重载Stroke的DrawCore方法,效果图:

12

------------------------------------------------------------

代码如下:

/// <summary>
    /// 图形笔
    /// </summary>
    public class ImageStroke : Stroke
    {
        private string imageFile_;
        private System.Windows.Media.ImageSource imageSource_;
        private Point curPoint;
        public ImageStroke(System.Windows.Input.StylusPointCollection points, DrawingAttributes da, string file)
            : base(points, da)
        {
            this.imageFile_ = file;
            this.imageSource_ = new System.Windows.Media.Imaging.BitmapImage(new Uri( this.imageFile_));
        }

        protected override void DrawCore(System.Windows.Media.DrawingContext drawingContext, DrawingAttributes drawingAttributes)
        {
            double num = drawingAttributes.Width + 20.0;
            System.Windows.Media.StreamGeometry streamGeometry = new System.Windows.Media.StreamGeometry();
            using (System.Windows.Media.StreamGeometryContext streamGeometryContext = streamGeometry.Open())
            {
                streamGeometryContext.BeginFigure((Point)base.StylusPoints[0], false, false);
                drawingContext.DrawImage(this.imageSource_, new Rect(((Point)base.StylusPoints[0]).X - num / 2.0, ((Point)base.StylusPoints[0]).Y - num / 2.0, num, num));
                this.curPoint = (Point)base.StylusPoints[0];
                foreach (System.Windows.Input.StylusPoint current in base.StylusPoints)
                {
                    ImageStroke.DrawImage(ref this.curPoint, (Point)current, num, drawingContext, this.imageSource_);
                }
            }
        }

        public static double GetDistance(Point a, Point b)
        {
            return System.Math.Abs(Point.Subtract(a, b).Length);
        }
        public static Point GetPointBetween(Point a, Point b, double len)
        {
            Vector vector = Point.Subtract(a, b);
            vector.Normalize();
            vector = Vector.Multiply(vector, len);
            return Point.Subtract(a, vector);
        }

        public static void DrawImage(ref Point a, Point b, double width, System.Windows.Media.DrawingContext drawingContext, System.Windows.Media.ImageSource imageSource)
        {
            for (double distance = ImageStroke.GetDistance(a, b); distance >= width; distance = ImageStroke.GetDistance(a, b))
            {
                Point pointBetween = ImageStroke.GetPointBetween(a, b, width);
                drawingContext.DrawImage(imageSource, new Rect(pointBetween.X - width / 2.0, pointBetween.Y - width / 2.0, width, width));
                a = pointBetween;
            }
        }
    }

 

 

实例应用可以参考纹理笔,在生成stroke对象时候使用ImageStroke然后将stroke添加到inkcanvas的strokes集合中

posted on 2015-03-19 10:25  andy1987  阅读(889)  评论(0编辑  收藏  举报

导航