日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

[C#] Direct2D 学习笔记 (一)vb.net转换为c#

發(fā)布時間:2023/12/18 C# 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C#] Direct2D 学习笔记 (一)vb.net转换为c# 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ?寫在前面:最近要做一個有關(guān)于地圖的項目[C#],開始選擇 GDI+ 作圖,不知是算法問題還是 GDI+ 本身問題,加載非常慢而且拖動各種閃爍。迫于無奈最終放棄了 GDI+ 方式而嘗試 Direct2D。但是讓我意外的是網(wǎng)上有關(guān) Direct2D 的教程很少,而且為數(shù)不多的教程中大多數(shù)是用 C++寫的(據(jù)說是因為效率高),少部分是用VB.NET ,用 C# 的幾乎沒有(我是真的沒找到)。最終我選擇了一個VB.NET的教程為藍本進行學(xué)習(xí),將他的 VB 代碼轉(zhuǎn)化成 C# 代碼。(之前自學(xué)過一點C++和VB,也多虧這點基礎(chǔ)我還能看懂)

一、什么是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)?
添加如下命名空間:

using Microsoft.WindowsAPICodePack.DirectX; using Microsoft.WindowsAPICodePack.DirectX.Direct2D1; using Microsoft.WindowsAPICodePack.DirectX.Graphics;
  • 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 中生命一個全局變量:

private clsDirect2DSample _D;
  • 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。