GDI 的替代者 D2D

2021-07-22 19:01:50 字數 3469 閱讀 4759

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 使用者介...