DrawTool画笔之图形笔

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

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

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

代码如下:

///<summary>///图形笔///</summary>publicclassImageStroke : Stroke

{PRivatestringimageFile_;privateSystem.Windows.Media.ImageSource imageSource_;privatePoint curPoint;publicImageStroke(System.Windows.Input.StylusPointCollection points, DrawingAttributes da,stringfile)

:base(points, da)

{this.imageFile_ =file;this.imageSource_ =newSystem.Windows.Media.Imaging.BitmapImage(newUri(this.imageFile_));

}protectedoverridevoidDrawCore(System.Windows.Media.DrawingContext drawingContext, DrawingAttributes drawingAttributes)

{doublenum = drawingAttributes.Width +20.0;

System.Windows.Media.StreamGeometry streamGeometry=newSystem.Windows.Media.StreamGeometry();using(System.Windows.Media.StreamGeometryContext streamGeometryContext =streamGeometry.Open())

{

streamGeometryContext.BeginFigure((Point)base.StylusPoints[0],false,false);

drawingContext.DrawImage(this.imageSource_,newRect(((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 currentinbase.StylusPoints)

{

ImageStroke.DrawImage(refthis.curPoint, (Point)current, num, drawingContext,this.imageSource_);

}

}

}publicstaticdoubleGetDistance(Point a, Point b)

{returnSystem.Math.Abs(Point.Subtract(a, b).Length);

}publicstaticPoint GetPointBetween(Point a, Point b,doublelen)

{

Vector vector=Point.Subtract(a, b);

vector.Normalize();

vector=Vector.Multiply(vector, len);returnPoint.Subtract(a, vector);

}publicstaticvoidDrawImage(refPoint a, Point b,doublewidth, System.Windows.Media.DrawingContext drawingContext, System.Windows.Media.ImageSource imageSource)

{for(doubledistance = ImageStroke.GetDistance(a, b); distance >= width; distance =ImageStroke.GetDistance(a, b))

{

Point pointBetween=ImageStroke.GetPointBetween(a, b, width);

drawingContext.DrawImage(imageSource,newRect(pointBetween.X - width /2.0, pointBetween.Y - width /2.0, width, width));

a=pointBetween;

}

}

}

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航