相關知識參考DrawTool畫筆之紋理筆 , 圖形筆的實現跟紋理筆的實現是一樣的,重載Stroke的DrawCore方法,效果圖:

------------------------------------------------------------
代碼如下:
/// <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集合中
新聞熱點
疑難解答