[C#] Direct2D 学习笔记 (一)vb.net转换为c#
一、什么是Direct2D
一言以蔽之,就是Windows 7平臺上的一個2D圖形API,可以提供高性能,高質(zhì)量的2D渲染。大多數(shù)人對Direct2D可能都比較陌生,以至于我之前在論壇上提到這個詞的時候,有人竟然說你是不是寫錯了?可能大家比較熟悉的是Direct3D,因為D3D已經(jīng)是當(dāng)前游戲界的主流應(yīng)用。在過去,3D世界是OpenGL與DirectX二分天下,但是由于OpenGL發(fā)展十分滯后,而且沒有一個像微軟這樣強大的后臺支柱,所以逐漸被DirectX所超越。回過頭來說2D,過去Windows上的2D程序還主要基于GDI和GDI+,遺憾的是這兩者都是軟件實現(xiàn),而Direct2D則不同,它基于Direct3D,所以能夠使用硬件加速功能,能更大程度的發(fā)揮硬件特性,創(chuàng)建高性能,高質(zhì)量的2D圖形,這些圖形包括幾何圖形,如矩形,橢圓等。還有位圖,文本等。
二、VS2013 的 Direct2D 運行庫?
首先需要下載Windows API Code Pack 1.1.zip解壓后,在\Windows API Code Pack 1.1\binaries\DirectX目錄下有兩個子文件夾”x64”、”x86”。分別代表著64位、32位下的運行庫。?
在自己的項目中引用x86下的Microsoft.WindowsAPICodePack.DirectX.dll文件。就可以進行Direct2D開發(fā)了。
三、示例?
新建一個空的winform工程,引用dll。(引用x86下的dll)?
添加如下命名空間:
- 1
- 2
- 3
在Form.cs里的namespace xxxx里添加如下類:
public class clsDirect2DSample {//D2D工廠對象,ID2D1Factory接口。private D2DFactory _d2dFactory;//渲染窗口,ID2D1HwndRenderTarget接口。private RenderTarget _renderTarget;//構(gòu)造函數(shù)public clsDirect2DSample(){//創(chuàng)建一個D2D工廠對象_d2dFactory = D2DFactory.CreateFactory();}public void CreateDeviceResource(Control Target){//如果_renderTarget沒有初始化if(_renderTarget==null){//初始化,在_d2dFactory創(chuàng)建渲染緩沖區(qū)并與Target綁定_renderTarget=_d2dFactory.CreateHwndRenderTarget(new RenderTargetProperties(),new HwndRenderTargetProperties(Target.Handle,new SizeU((uint)Target.Width,(uint)Target.Height),PresentOptions.None));}}public void Render(){if(_renderTarget!=null){//開始繪制_renderTarget.BeginDraw();//橢圓Ellipse E = new Ellipse(new Point2F(50, 50), 30, 40);//定義一個畫刷SolidColorBrush B = _renderTarget.CreateSolidColorBrush(new Microsoft.WindowsAPICodePack.DirectX.Direct2D1.ColorF(0, 1, 0));//將橢圓繪制在渲染緩沖區(qū)_renderTarget.DrawEllipse(E, B, 4);//結(jié)束繪制_renderTarget.EndDraw();}}}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
在窗體上放置一個名稱為:panel1的panel控件?
在窗體類 Form1: Form 中生命一個全局變量:
- 1
在Form1_Load函數(shù)里添加:
_D = new clsDirect2DSample();_D.CreateDeviceResource(this.panel1);- 1
- 2
在Form1_Paint函數(shù)里添加:
_D.Render();- 1
至此代碼部分完成。?
啟用“啟用非托管代碼調(diào)試”(啟用本機代碼調(diào)試):?
項目->xxxx屬性->“調(diào)試”選項卡->勾選“啟用本機代碼調(diào)試”。
修改App.config內(nèi)容如下
<?xml version="1.0" encoding="utf-8" ?> <configuration><startup useLegacyV2RuntimeActivationPolicy="true"><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /><supportedRuntime version="v2.0.50727"/></startup> </configuration>- 1
- 2
- 3
- 4
- 5
- 6
- 7
運行效果如圖:?
上述過程就是:?
在D2D工廠對象(_d2dFactory)的渲染緩沖區(qū)/窗口(_renderTarget)中繪制圖形(各種Draw方法)并最終顯示(EndDraw方法)在其綁定的控件/窗體(Target)上。?
so,實際使用需要分幾步走:?
1,創(chuàng)建D2DFactory且必須首先被創(chuàng)建。在類的構(gòu)造函數(shù)中,用CreateFactory函數(shù)創(chuàng)建D2DFactory。?
2,創(chuàng)建RenderTarget,渲染緩沖區(qū),相當(dāng)于畫板,在其上進行繪圖操作。本例中用D2DFactory類的CreateHwndRenderTarget方法創(chuàng)建。兩個參數(shù):RenderTargetProperties類,設(shè)置RenderTarget的一些屬性(DPI等,在該類重載初始化函數(shù)中可以設(shè)置);HwndRenderTargetProperties類設(shè)置綁定的Hwnd的屬性(Hwnd、寬、高等屬性)(這里有個疑問,為什么要傳入Hwnd的寬和高?既然有句柄,這些屬性應(yīng)該可以直接獲取到啊。。。)?
3,進行繪圖,要注意繪圖順序?qū)е碌膶盈B關(guān)系,最后調(diào)用EndDraw顯示在窗口/控件上。
后記:網(wǎng)上說 C# 的效率很低因此不適合做界面渲染,具體怎樣我不清楚。其實對于我這種初學(xué)者來說,語言效率什么的并不重要,因為我能做到的效果還涉及不到效率問題,我僅僅要求是“能實現(xiàn)效果”。因此, 僅以此系列文章 獻給那些和我一樣的小白們。
參考:http://www.cnblogs.com/grenet/p/3249664.html?
參考:http://www.cnblogs.com/graphics/category/412802.html
總結(jié)
以上是生活随笔為你收集整理的[C#] Direct2D 学习笔记 (一)vb.net转换为c#的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H.264解码器中CAVLC码表查找算法
- 下一篇: C#中的bitmap类和图像像素值获取方