Win2D
首发于Win2D
第二章 画布渲染目标CanvasRenderTarget

第二章 画布渲染目标CanvasRenderTarget

前面的文章介绍了Win2D的两种类型,一种是位图(CanvasBitmap)类型,可以作为图像被被绘制;一种是画布控件(CanvasControl)类型,可以作为画布用来绘制图像。那么有没有一种类型既可以作为UWP的图像也可以作为画布呢?

答案是有的,画布渲染目标(CanvasRenderTarget)类型就可以。

在创建资源(CreateResources)事件里,实例化一个W1000 H400的画布渲染目标(CanvasRenderTarget)

画布渲染目标CanvasRenderTarget

实例化画布渲染目标需要指定三个参数

  • 画布控件&画布动画控件&画布虚拟控件
  • 宽度
  • 高度


请注意,一个画布渲染目标指定了画布控件就不能用在画布动画控件的绘制上,否则会导致崩溃
这种让你摸不清头脑的崩溃报错,也许正是你把指定了不同控件的渲染目标用错了地方


当然了,画布渲染目标是不会显示在屏幕上的,还需要手动再次绘制到画布控件(CanvasControl)上


绘制

当画布渲染目标作为画布用来绘制图像时,它的用法和画布控件(CanvasControl)差不多

绘制黑色矩形:

using (CanvasDrawingSession ds = CanvasRenderTarget1.CreateDrawingSession())
{
    ds.DrawRectangle(0, 0, 100, 100, Colors.Black);//绘制矩形
}
第一个画布渲染目标上绘制了一个X0 Y0 W100 H100的黑色矩形

被绘制

当画布渲染目标作为图像被被绘制时,与位图无异

画布渲染目标的被绘制到画布控件上:

private void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
   CanvasDrawingSession ds= args.DrawingSession();
   ds.DrawImage(CanvasRenderTarget3);
   ds.DrawImage(CanvasRenderTarget2);
   ds.DrawImage(CanvasRenderTarget1);
}
三个画布渲染目标被绘制到了画布控件(CanvasControl)上

互相绘制

还可以把画布渲染目标1和2,绘制到画布渲染目标3上......

在3里,绘制1和2:

using (CanvasDrawingSession ds = CanvasRenderTarget3.CreateDrawingSession)
{
      ds.DrawImage(CanvasRenderTarget2);
      ds.DrawImage(CanvasRenderTarget1);
}
没错,画布渲染目标就是这么可攻可受......

清空画布渲染目标:

using (CanvasDrawingSession ds = CanvasRenderTarget1.CreateDrawingSession)
{
   ds.Clear(Colors.Transparent);//清除为透明色
}
using (CanvasDrawingSession ds = CanvasRenderTarget2.CreateDrawingSession)
{
   ds.Clear(Colors.Transparent);//清除为透明色
}
using (CanvasDrawingSession ds = CanvasRenderTarget3.CreateDrawingSession)
{
   ds.Clear(Colors.Transparent);//清除为透明色
}

画布渲染目标(CanvasRenderTarget)是Win2D中最为灵活的一种类型,适合拿来做很多事情

  • 图层渲染
  • 画布显示
  • 存储图像

垃圾微软的官方文档:屏幕外绘制

最后,学有余力的童鞋可以看看绘画会议(CanvasDrawingSession)的所有绘制方法

CanvasDrawingSession 类


注意

  1. 在CanvasRenderTarget里绘制时,必须在using语句块内进行。
  2. CanavsRnnderTarget实现了IDispose接口,支持using语句块里实例化并在结束时释放资源。并且当它释放资源时,也就是绘制结束的过程。
  3. 当进入using语句块时,画布渲染目标的数据进入一种可编辑状态(我叫它ddf状态),此时它可以进行绘制,但不会显示在上面。
  4. using语句块结束时,也就是触发了IDispose,此时退出ddf状态,画布渲染目标上面就有东西了。

也就是说,CanvasRenderTarget的绘制必须在using语句块内进行,不然没有效果。因此每次绘制都要在using()里实例化CanvasDrawingSession(这个操作是非常快的不用担心性能问题)。

文章被以下专栏收录

    Win2D是一款易于使用的Windows运行时API,可用于GPU加速的即时模式2D图形渲染。它适用于为Windows通用平台(UWP)编写应用程序的C#,C ++和VB开发人员。它利用了Direct2D的强大功能,并与XAML和CoreWindow无缝集成。