先上图:

今天我们要实现的是DrawTool画笔集合中的一种纹理笔,很多人可能对纹理笔概念还比较生疏,其实如果你接触过类似一些教育行业交互式白板的话,对纹理笔并不会感到陌生,纹理笔我们可以简单的理解为是一种通过图片来呈现笔迹的方式.在继续下面的阅读前,你有必要先了解下以下知识:

通过上面的文章,我们知道DynamicRenderer为我们提供是呈现,而Stroke是最后我们生成笔迹,如果要实现纹理笔,我们需要重载DynamicRenderer的OnDraw和Stroke的DrawCore方法.

1. 自定义Stroke

public  class TextureStroke : Stroke
{
private System.Windows.Media.ImageSource imageSource_;
//纹理图片
private string textureFile_;
public TextureStroke(StylusPointCollection stylusPoints, DrawingAttributes da , string file )
: base(stylusPoints, da)
{
this.textureFile_ = file;
this.imageSource_ = new System.Windows.Media.Imaging.BitmapImage(new Uri(this.textureFile_));
} /// <summary>
/// 实现绘制
/// </summary>
/// <param name="drawingContext"></param>
/// <param name="drawingAttributes"></param>
protected override void DrawCore(DrawingContext drawingContext, DrawingAttributes drawingAttributes)
{
double width = drawingAttributes.Width * 2.0;
System.Windows.Media.StreamGeometry streamGeometry = new System.Windows.Media.StreamGeometry();
using (System.Windows.Media.StreamGeometryContext streamGeometryContext = streamGeometry.Open())
{
streamGeometryContext.BeginFigure((Point)base.StylusPoints[], false, false);
foreach (System.Windows.Input.StylusPoint current in base.StylusPoints)
{
streamGeometryContext.LineTo((Point)current, true, true);
}
streamGeometryContext.Close();
} DrawTexture(streamGeometry, this.imageSource_, drawingContext, width, this.textureFile_);
} public static void DrawTexture(Geometry geometry, ImageSource imageSource, DrawingContext drawingContext, double width, string imagePath)
{
Rect rc = geometry.Bounds;
DrawingBrush drawingBrush = new DrawingBrush(new ImageDrawing
{
Rect = rc,
ImageSource = imageSource
});
drawingBrush.TileMode = TileMode.Tile;
Uri uriSource = new Uri(imagePath);
BitmapImage bitmapImage = new BitmapImage(uriSource);
drawingBrush.Viewport = new Rect(0.0, 0.0, (double)bitmapImage.PixelWidth, (double)bitmapImage.PixelHeight);
drawingBrush.ViewportUnits = BrushMappingMode.Absolute;
PathGeometry widenedPathGeometry = geometry.GetWidenedPathGeometry(new Pen(null, width)
{
StartLineCap = PenLineCap.Round,
EndLineCap = PenLineCap.Round
});
Pen pen = new Pen(drawingBrush, 80.0);
drawingContext.PushClip(widenedPathGeometry);
drawingContext.DrawRectangle(drawingBrush, pen, rc);
drawingContext.Pop();
}
}

2.实例应用

这里我们使用到上篇文章中介绍的多点触摸画板 ,修改其中_startStroke方法中stroke对象的生成,相应代码如下:

bool isTexturePen = true ; // 外部定义的私有变量

private void _startStroke(object device, Point inputPosition){
// ... { some code } //==这里根据变量isTexturePen来判断使用默认的stroke还是自定义的stroke
Stroke stroke = isTexturePen==true ? new TextureStroke( stylusPointCollection , this._inkCanvas.DefaultDrawingAttributes,"c:\\1.png") : new Stroke(stylusPointCollection);
//end // .... { some code }
}

3. 结束

DrawTool系列文章中涉及的代码都是通过修改后的,仅仅适用于demo场景,如果需要商业请自行修改,包括性能上的调整.

DrawTool画笔之纹理笔的更多相关文章

  1. DrawTool画笔之图形笔

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

  2. DrawTool多重笔之前奏 => 通过InkAnalyzer实现图形识别

    这里要介绍的是通过InkAnalyzer来实现简单图形的识别,例如圆,椭圆,正方形,三角形等,当然你也可以通过扩展来实现自定义图形的识别,在使用InkAnalyzer前,你需要引用IAWinFX.dl ...

  3. 多点触摸画板(MultiTouchCanvas)

    这是个简单的支持多点触摸的画板控件, 绘制功能基于WPF InkCanvas,也是我drawTool系列文章的开篇. 阅读该文章后可能产生一些问题: 1. 如果对生成的笔迹对象进行控制 如果要对生成的 ...

  4. 超全面的.NET GDI+图形图像编程教程

    本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了 ...

  5. CG基础教程-陈惟老师十二讲笔记

    转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...

  6. Photoshop技能167个经典的Photoshop技巧大全

    Photoshop技能167个经典的Photoshop技巧大全 学PS基础:Photoshop 技能167个­ 经典的Photoshop技巧大全,如果你是初级阶段的水平,熟读此文并掌握,马上进阶为中级 ...

  7. GDI编程

    图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...

  8. 干货分享,40个photoshop技能送给你!

    自从有了“PS(Photoshop)”以后,很多事情变成了可能,你可以上九天揽月,也可以下五洋捉鳖,照片中,你可以出现在任何你想在的地方.而最基本的美化照片的功能,我想是很多同学学习PS的初衷.当你掌 ...

  9. ps基础入门快捷方法总结

    1. 快速打开文件 双击Photoshop的背景空白处(默认为灰色显示区域)即可打开选择文件的浏览窗口. 2. 随意更换画布颜色 选择油漆桶工具并按住Shift点击画布边缘,即可设置画布底色为当前选择 ...

随机推荐

  1. 最小点覆盖 hdu--1054

    点击打开题目链接 最小点覆盖=最大二分匹配的 (单向图) ; 最小点覆盖=最大二分匹配的一半 (双向图) ; 证明 所以我们只需求最大匹配,用 匈牙利算法 求出最大匹配,除以二得到答案 具体算法都已经 ...

  2. python 函数定义

    我们可以创建一个函数来列出费氏数列 >>> def fib(n): # write Fibonacci series up to n ... """Pr ...

  3. windows切换到谷歌浏览器黑屏问题

    打开谷歌浏览器,找到右上角,点击设置,如下: 点击高级设置,如下: 关闭使用硬件加速模式,重新打开浏览器,即可.

  4. 配置tomcat https的步骤

    keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\tomcat.keystore -validity 36500 keytool -g ...

  5. sip协议呼叫流程详解

    1.SIP业务基本知识 1.1 业务介绍会话初始协议(Session Initiation Protocol)是一种信令协议,用于初始.管理和终止网络中的语音和视频会话,具体地说就是用来生成.修改和终 ...

  6. zlog日志库的简单封装,以及给debug级别添加颜色显示

    现看看效果如何: 方法如下: 定义相关颜色的宏 #define ESC_START "\033[" #define ESC_END "\033[0m" #def ...

  7. dubbo框架介绍

    1.背景 (#) 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小 ...

  8. HDU-2616

    Kill the monster Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. 前端HTML 与css 整理(未完)

    HTML 中的标签存放于文本文件中 需要按照以下固定的文档结构组织:<!DOCTYPE HTML><html> <head>头部相关信息 </head> ...

  10. 带emoji表情弹出层的评论框,semantic+emoji picker,java.sql.SQLException: Incorrect string value: '\xF0\x9F..'

    在自己做一个项目玩时,在做评论的时候. 选中了semantic.js原型,这个在国内用的不是很多,但是在github上star数量很高,想当初我想找一个js框架是就在上面找的. semantic中文网 ...