蜀中肥牛

来自川北的凉粉

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

咱们一起学Direct2D之一绘制椭圆

目前,在博客园上,相对写得比较好的三个关于Direct2D的教程系列,分别是万一Direct2D系列,万仓一黍Direct2D系列和zddDirect2D系列。

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();
        }
    }
}

最后的结果

 

posted on 2016-06-23 14:32  蜀中肥牛  阅读(390)  评论(0)    收藏  举报