咱们一起学Direct2D之一绘制椭圆
目前,在博客园上,相对写得比较好的三个关于Direct2D的教程系列,分别是万一的Direct2D系列,万仓一黍的Direct2D系列和zdd的Direct2D系列。
1、万一的 Direct2D 系列,用的是Delphi 2009
2、万仓一黍的 Direct2D教程 系列,用的是VS2010的Visual Basic语言
3、zdd的 Direct2D 系列,用的是VS中的C++
有兴趣的网友可以去看看。本系列也是介绍Direct2D的教程,是基于Visual C#的SlimDX库Direct2D的教程
使用 Direct2D 绘制该矩形的代码和GDI+很相似:它创建绘制资源,说明要绘制的形状,绘制该形状,然后释放绘制资源。下面几节详细说明以上每个步骤。
一.引用命名空间
using SlimDX; using SlimDX.Direct2D;
二.所有 Direct2D 示例首先要完成一些任务,其中之一就是创建 Factory
Factory factory; public void InitDx2D() { factory = new Factory(FactoryType.SingleThreaded); //创建单线程工厂对象 }
Factory 是使用 Direct2D 的起点;使用 Factory 可创建 Direct2D 资源。
创建工厂时,可指定它是多线程还是单线程的。(有关多线程工厂的详细信息,请参见 ID2D1Factory 参考页面上的备注。)此示例创建一个单线程工厂。
一般而言,应用程序应创建一次工厂,然后在应用程序的生命周期中保留它。
三.创建 WindowRenderTarget
创建工厂之后,使用它来创建呈现器目标。
RenderTargetProperties RTproperties = new RenderTargetProperties(); RTproperties.Type = RenderTargetType.Hardware; //指定呈现器类型 WindowRenderTargetProperties WRTproperties = new WindowRenderTargetProperties(); //呈现器目标的初始大小(以像素为单位)及其显示选项 WRTproperties.Handle = intPtr; WRTproperties.PixelSize = this.ClientSize; //显示大小 WRTproperties.PresentOptions = PresentOptions.None; //使用默认显示选项 renderTarget = new WindowRenderTarget(factory, RTproperties, WRTproperties);
呈现器目标是一种设备,可执行绘制操作和创建与设备相关的绘制资源,如画笔。不同类型的呈现器目标呈现到不同设备。前面的示例使用 WindowRenderTarget,它呈现到一部分屏幕上。
此段加入到上面的 public void InitDx2D(IntPtr intPtr) { }
四.创建渲染函数
public void Render() { if (renderTarget == null) { return; } renderTarget.BeginDraw(); //开始绘制 Ellipse e = new Ellipse() { Center=new PointF(50,50), RadiusX=30, RadiusY=40}; //创建椭圆对象 SolidColorBrush brush = new SolidColorBrush(renderTarget, new Color4(Color.Red)); //创建画刷 renderTarget.DrawEllipse(brush, e); //绘制椭圆 renderTarget.EndDraw(); }
五.总结一下,这个类的代码应该是下面这样子
using SlimDX; using SlimDX.Direct2D; using System.Windows.Forms; using System.Drawing; namespace Demo1Test { class Demo1 { Factory factory; WindowRenderTarget renderTarget; public void InitDx2D(Control control) { factory = new Factory(FactoryType.SingleThreaded); //创建工厂对象 RenderTargetProperties RTproperties = new RenderTargetProperties(); RTproperties.Type = RenderTargetType.Hardware; //指定呈现器类型 WindowRenderTargetProperties WRTproperties = new WindowRenderTargetProperties(); //呈现器目标的初始大小(以像素为单位)及其显示选项 WRTproperties.Handle = control.Handle; WRTproperties.PixelSize = control.ClientSize; //显示大小 WRTproperties.PresentOptions = PresentOptions.None; //使用默认显示选项 renderTarget = new WindowRenderTarget(factory, RTproperties, WRTproperties); } public void Render() { if (renderTarget == null) { return; } renderTarget.BeginDraw(); //开始绘制 Ellipse e = new Ellipse() { Center = new PointF(50, 50), RadiusX = 30, RadiusY = 40 }; //创建椭圆对象 SolidColorBrush brush = new SolidColorBrush(renderTarget, new Color4(Color.Red)); //创建画刷 renderTarget.DrawEllipse(brush, e); //绘制椭圆 renderTarget.EndDraw(); } } }
六.测试调用,新建一个Windows窗体应用程序 Demo1Test, 分别在窗体的 Form1_Load 事件下初始化 Demo1 对象, 在窗体的 Form1_Paint 事件下渲染对象, 看起来像下面这样子
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Demo1Test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Demo1 test; private void Form1_Load(object sender, EventArgs e) { test = new Demo1(); test.InitDx2D(this); } private void Form1_Paint(object sender, PaintEventArgs e) { test.Render(); } } }
最后的结果

浙公网安备 33010602011771号