zoukankan      html  css  js  c++  java
  • 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集合中

  • 相关阅读:
    过滤指定目录下指定后缀名文件
    Oracle 存储过程创建表
    编码测试之控制条件筛选心得——AE二次开发篇
    log4j配置祥解 (转)
    手机浏览器的viewport(视觉窗口)
    git 常用技巧
    添加eclipse的字体样式
    如何检测android 文件签名成功(转帖)
    javascript 解析json
    身份证正则表达式
  • 原文地址:https://www.cnblogs.com/andy1987/p/4349677.html
Copyright © 2011-2022 走看看