Direct2D 快速入門

2021-08-27 02:12:18 字數 3087 閱讀 2484

本文為msdn direct2d 部分譯文,歡迎指點!原文:

direct2d 是用於建立2d圖形的本地即時模式應用程式介面。本文介紹如何在典型的win32應用程式中運用direct2d進行繪製。

switch(message)

return 0;

// ...處理其它訊息.

要用 gdi 繪製乙個矩形,需要捕獲 wm_paint 訊息,如下**所示。

除了win32應用程式所需的標頭檔案之外,還要包含 d2d1.h 標頭檔案。

所有 direct2d 例程的首要任務之一是建立乙個id2d1factory。

id2d1factory* pd2dfactory = null;

hresult hr = d2d1createfactory(

d2d1_factory_type_single_threaded,

&pd2dfactory

);

id2d1factory介面是使用 direct2d 的起點;使用 id2d1factory 建立 direct2d 資源。建立 id2d1factory 時,可以指定它是多執行緒還是單執行緒。本例程建立乙個單執行緒工廠。

通常,你的應用程式應該建立一次工廠並儲存之直到應用程式結束。

建立工廠之後,用它建立乙個渲染目標。

// 獲得繪製區域的大小.

rect rc;

getclientrect(hwnd, &rc);

// 建立 direct2d 渲染目標

id2d1hwndrendertarget* prt = null;

hresult hr = pd2dfactory->createhwndrendertarget(

d2d1::rendertargetproperties(),

d2d1::hwndrendertargetproperties(

hwnd,

d2d1::sizeu(rc.right - rc.left, rc.bottom - rc.top ),

&prt);

渲染目標是乙個能完成繪圖操作並能建立如畫刷之類裝置相關繪圖資源的裝置。不同型別的渲染目標渲染到不同裝置上。上述例程使用 id2d1hwndrendertarget,它渲染到螢幕的某個區域。

如果可能,渲染目標使用gpu加速渲染操作並建立繪製資源。否則,渲染目標使用cpu處理渲染指令並建立資源。(建立渲染目標時可以通過d2d1_render_target_type標記修改這種行為。)

createhwndrendertarget 函式有三個引數。第乙個引數,是乙個 d2d1_render_target_properties 結構,指明遠端顯示選項,是強制渲染目標渲染到軟體還是硬體,並指明dpi。本例程用 d2d1::rendertargetproperties 輔助函式來接收預設渲染目標屬性。第二個引數,是乙個 d2d1_hwnd_render_target_properties 結構,指明要渲染到哪個視窗的控制代碼、渲染目標的初始大小(畫素)以及它的描述選項。本例程用d2d1::hwndrendertargetproperties 輔助函式來指明乙個視窗控制代碼和初始尺寸,並使用預設描述選項。第三個引數是渲染目標指標的位址。

當建立乙個渲染目標並且硬體加速可用時,資源分配給計算機的gpu.通過建立乙個渲染目標並盡可能久地儲存它,有助於提公升效能。應用程式要建立一次渲染目標,並儲存它趕到程式結束或者收到d2derr_recreate_target 錯誤。當收到此錯誤時,需要重新建立渲染目標(包括它建立的任何資源)。

像工廠一樣,渲染目標可以建立繪製資源。本例中用渲染目標建立乙個畫刷。

id2d1solidcolorbrush* pblackbrush = null;

if (succeeded(hr))

畫刷是繪製乙個區域的物件,就像形狀的筆觸或填充的幾何物件。本例中的畫刷用定義好的實心黑色來繪製乙個區域。direct2d 還提供了其實型別的畫刷:漸變畫刷用來繪製線性或徑向漸變,位圖畫刷使用點陣圖和圖案進行繪製。有些繪圖api提供繪製輪廓和填充形狀的畫筆。direct2d 不一樣:它不提供畫筆,但使用畫刷來繪製輪廓和填充形狀。繪製輪廓時,使用id2d1strokestyle 介面的畫刷來控制描邊路徑操作。畫刷只能由建立它的渲染目標使用或由同一資源區域的其它渲染目標使用。 通常,應該建立一次畫刷並儲存它直到建立它的渲染目標結束。但id2d1solidcolorbrush是乙個例外;因為建立它相對比較容易,你可以每次繪製乙個框架時都建立乙個id2d1solidcolorbrush物件,而不會造成明顯的效能損失。也可以只用乙個id2d1solidcolorbrush物件,每次使用它時改變它的顏色。

接下來,用渲染目標來繪製矩形。

prt->begindraw();

prt->drawrectangle(

d2d1::rectf(

rc.left + 100.0f,

rc.top + 100.0f,

rc.right - 100.0f,

rc.bottom - 100.0f),

pblackbrush);

hresult hr = prt->enddraw();

drawrectangle 函式接收兩個引數:將要繪製的矩形,和用來繪製矩形外框的畫刷。也可以指定筆觸寬度、填充圖案、線條結點以及結尾「帽子」等選項。發出任何繪製指令之前,必須先呼叫begindraw 函式,並且完成繪製後必須呼叫 enddraw 函式。enddraw 函式返回乙個 hresult 修士,表明繪製是否成功。

當沒有更多框架要繪製或接收到d2derr_recreate_target 錯誤時,釋放渲染目標和它建立的所有裝置。

saferelease(prt);

saferelease(pblackbrush);

當應用程式使用完direct2d資源時(例如程式將要退出時),釋放direct2d 工廠物件。

saferelease(pd2dfactory);

Direct2D 學習筆記

direct2d 以下簡稱d2d 是乙個 使用者模式的庫,基於 d3d 10.1 api 從 win8開始,d2d 基於 d3d 11.1 所以 d2d 可以提供 gpu 硬體加速。d2d架構圖 第一步 標頭檔案 include第二步 建立乙個 id2d1 工廠 1 id2d1factory m p...

Direct2D 中層概述

物件表示,它使應用程式可以操作一組繪製操作。可通過將層 壓入 呈現器目標的方式來使用層。呈現器目標執行的後續繪製操作將被指引到壓入的層。在處理完該層之後,可從呈現器目標 彈出 該層,這可將該層的內容重新復合到呈現器目標中。雖然層提供了一種用於產生有趣效果的強大呈現方法,但在應用程式中過多使用層可能會...

Direct2D實現文字映象陰影

一 實現思路 先繪製文字陰影部分,繪製陰影文字後應用3dtransform與高斯模糊特效,最後再正常繪製一次文字主體。二 實現 hr m pdwritefactory createtextformat sc fontname,null,dwrite font weight normal,dwrite...