winform中的2d繪圖,以前用的都是gdi+。在簡單應用環境下,如果不在乎速度,gdi+可以表現的很好。機緣巧合,前段時間做了乙個簡單的3d程式,使用的是c#託管 + directx9 sdk,平台是win7 + vs2012。 專案做完以後,回顧發現,其實也可以使用directx11的direct2d來進行2d繪圖,這樣可以盡量使用硬體加速,盡量解放cpu,使程式可以應用於更多場合。
direct2d的理想環境是mfc/c++;如今的我只有在編寫驅動程式時會用c++,對於已經習慣使用c#編寫winform的我來說,使用mfc開發direct2d不是不可以,但是畢竟拋開mfc已經很久了(那還是visualc++5.0時的回憶)。。。
在c#中使用direct2d,目前看來,最合適的工具就是sharpdx,sdx可以說是目前對directx的最好封裝,而且免費;其最大的缺點是,可以利用的文件實在太少了。閒話少敘,下面就從sharpdx開始:
二、建立乙個新工程,本例是建立乙個基於sharpdx的progress的控制項。
注:我使用的sdx是3.02版本,新建的c#工程需要定義為.net framework 4.5
0,準備工作:sdx中,無法使用c#的color,rectangle。。。因此需要做乙個轉換類
public class dxc
public static sharpdx.mathematics.interop.rawrectangle torect(rectangle rect)
public static sharpdx.mathematics.interop.rawrectanglef torectf(rectanglef rect)
}
sdx中使用的color,rectanglef等,大都在sharpdx.mathematics.interop空間中,上面dxc中靜態函式的作用就是做最基本的轉換。
在sdx中,顏色rawcolor4的定義是r/g/b/a,各個分量的取值是0~1
在sdx中,rawrectanglef使用的比較多。
1,新建乙個基於control的類
[toolboxitem(true), toolboxbitmap(typeof(system.windows.forms.progressbar))]
public class dxprogressbar : control
2,新增屬性
int _pvalue = 0;
public int value
set}
color _pbordercor = color.black;
public color bordercolor
set}
color _ptextcolor = color.blue;
public color textcolor
set}
3,建構函式
public dxprogressbar()
initd2d的作用是初始化sdx裝置,後面有它的函式原型。
三、下面是繪圖相關處理
1,新增引用
using sharpdx.dxgi;
using sharpdx.direct2d1;
using sharpdx.mathematics.interop;
using sharpdx.directwrite;
using alphamode = sharpdx.direct2d1.alphamode;
using dxfactory = sharpdx.direct2d1.factory;
using txfactory = sharpdx.directwrite.factory;
2,新增變數宣告
dxfactory dxfactory;
windowrendertarget dxtarget;
pixelformat pixelformat = new pixelformat(format.unknown, alphamode.premultiplied);
solidcolorbrush dxborderbrush;
solidcolorbrush dxvaluebruseh;
rawrectanglef dxborderrectf;
rawrectanglef dxvaluerectf;
txfactory txfactory;
textformat txformat;
textlayout txlayout;
solidcolorbrush txtbrush;
本例中,用於繪圖的資源、變數都使用dx開頭;而用於繪製文字的都使用 tx開頭。
3,變數初始化函式
private void initd2d();}
direct2d1.factory可以宣告單執行緒或者多執行緒。
windowrendertarget 是要繪製影象的目標。
solidcolorbrush 是畫筆,direct2d不使用pen,它同樣使用畫筆來繪製輪廓。
txfactory、textformat、textlayout等,用於繪製文字。
每次控制項大小變更,則重新分配資源
int px, py;
private void dxprogressbar_sizechanged(object sender, eventargs e)
dxborderrectf是控制項的輪廓區域。
4,渲染
private void render()
render函式,首先清空繪圖區域;初始化畫筆,繪製外形輪廓;計算進度條舉行區域,並繪製當前進度;列印當前進度值。
5,用onpaint對控制項繪圖
protected override void onpaint(painteventargs e)
使用sdx繪圖,都要以begindraw開始,以enddraw結束,這個跟d3d很像。
sdx中的資源,在整個程式執行週期中,都應該盡量保留,以節省資源。
下面是執行結果:
D2D技術介紹
一 d2d技術概述 d2d device to device 通訊是由3gpp組織提出的一種在通訊系統的控制下,允許lte終端之間在沒有基礎網路設施的情況下,利用小區資源直接進行通訊的新技術。它能夠提公升通訊系統的頻譜效率,在一定程度上解決無線通訊系統頻譜資源匱乏的問題。與此同時,它還可以有效降低終...
BackgroundWorker的替代者
樓主oldhunter 老獵人 2006 04 23 23 43 34 在 net技術 元件 控制項 開發提問 用過2.0中backgroundworker的估計都有遭遇不爽的經歷,網上有文章說已經被定為bug了.無bug版本估計要等.net的下乙個build了.前兩天寫了個backgroundwo...
向 MFC 專案新增 D2D 物件
此演練介紹如何將基本 direct2d d2d 物件新增到 visual c microsoft 基礎類庫 mfc 專案中,然後將該專案構建到在漸變背景上輸出 hello,world 的應用程式中。此演練演示如何完成以下這些任務 說明 對於在以下說明中使用的某些 visual studio 使用者介...