Direct2D 快速入門
Direct2D 是用來建立 2D 圖形的原生程式代碼立即模式 API。 本主題說明如何在典型的 Win32 應用程式中使用 Direct2D 來繪製到 HWND。
注意
如果您想要建立使用 Direct2D 的 Windows 市集應用程式,請參閱適用於 Windows 8 的 Direct2D 快速入門主題。
本主題包含下列各節:
- 繪製簡單矩形
- 步驟 1:包含 Direct2D 標頭
- 步驟 2:建立 ID2D1Factory
- 步驟 3:建立 ID2D1HwndRenderTarget
- 步驟 4:建立筆刷
- 步驟 5:繪製矩形
- 步驟 6:發行資源
- 建立簡單的 Direct2D 應用程式
- 相關主題
繪製簡單矩形
若要使用 GDI繪製矩形,您可以處理 WM_PAINT 訊息,如下列程式代碼所示。
switch(message)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
// Obtain the size of the drawing area.
RECT rc;
GetClientRect(
hwnd,
&rc
);
// Save the original object
HGDIOBJ original = NULL;
original = SelectObject(
ps.hdc,
GetStockObject(DC_PEN)
);
// Create a pen.
HPEN blackPen = CreatePen(PS_SOLID, 3, 0);
// Select the pen.
SelectObject(ps.hdc, blackPen);
// Draw a rectangle.
Rectangle(
ps.hdc,
rc.left + 100,
rc.top + 100,
rc.right - 100,
rc.bottom - 100);
DeleteObject(blackPen);
// Restore the original object
SelectObject(ps.hdc, original);
EndPaint(hwnd, &ps);
}
return 0;
// Code for handling other messages.
使用 Direct2D 繪製相同矩形的程式代碼很類似:它會建立繪圖資源、描述要繪製的圖形、繪製圖形,然後釋放繪圖資源。 後續各節會詳細說明這些步驟。
步驟 1:包含 Direct2D 標頭
除了 Win32 應用程式所需的標頭之外,還包含 d2d1.h 標頭。
步驟 2:建立 ID2D1Factory
任何 Direct2D 範例所做的第一件事之一,就是建立 ID2D1Factory。
ID2D1Factory* pD2DFactory = NULL;
HRESULT hr = D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED,
&pD2DFactory
);
ID2D1Factory 介面是使用 Direct2D 的起點;使用 ID2D1Factory 來建立 Direct2D 資源。
當您建立處理站時,可以指定它是多線程或單個線程。 (如需多線程處理站的詳細資訊,請參閱 ID2D1Factory 參考頁面的備註。此範例會建立單個線程處理站。
一般而言,您的應用程式應該只需建立一次工廠物件,並在應用程式的整個生命週期中保留它。
步驟 3:建立 ID2D1HwndRenderTarget
在建立工廠後,使用它來建立渲染目標。
// Obtain the size of the drawing area.
RECT rc;
GetClientRect(hwnd, &rc);
// Create a Direct2D render target
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 結構,會指定呈現內容的 HWND、轉譯目標的初始大小(以像素為單位),以及其 簡報選項。 此範例會使用 D2D1::HwndRenderTargetProperties 協助程式函式來指定 HWND 和初始大小。 它會使用預設的簡報選項。
第三個參數是接收轉譯目標參考之指標的位址。
當您建立轉譯目標和硬體加速可用時,您會在計算機的 GPU 上配置資源。 透過一次性建立渲染目標,並盡可能保留它,即可獲得效能優勢。 您的應用程式應該一次性建立渲染目標,並持續保留這些目標,直至收到 D2DERR_RECREATE_TARGET 錯誤為止。 當您收到此錯誤時,您需要重新創建渲染目標(以及它創建的任何資源)。
步驟 4:建立筆刷
如同工廠,轉譯目標可以創建繪圖資源。 在此範例中,渲染目標用來建立筆刷。
ID2D1SolidColorBrush* pBlackBrush = NULL;
if (SUCCEEDED(hr))
{
pRT->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::Black),
&pBlackBrush
);
}
筆刷是繪製區域的物件,例如圖形的筆劃或幾何填滿。 本範例中的筆刷會使用預先定義的純色黑色繪製區域。
Direct2D 也提供其他類型的筆刷:用於繪製線性和星形漸層的漸層筆刷,以及使用位圖和圖樣進行繪製的點陣圖筆刷。
某些繪圖 API 提供畫筆來繪製外框和筆刷來填滿圖形。 Direct2D 不同:它不提供畫筆物件,而是使用筆刷繪製外框和填滿圖形。 繪製外框時,請使用 ID2D1StrokeStyle 介面搭配筆刷來控制路徑繪製作業。
筆刷只能與建立它的轉譯目標以及相同資源域中的其他轉譯目標搭配使用。 一般而言,您應該在建立時只建立一次筆刷,並在整個轉譯目標的生命週期中保留它們。 ID2D1SolidColorBrush 是唯一的例外情況:因為建立它的成本相對較低,所以您可以在每次繪製框架時建立 ID2D1SolidColorBrush,而不會有任何明顯的效能降低。 您也可以使用單一 ID2D1SolidColorBrush,並在每次使用時變更其色彩。
步驟 5:繪製矩形
接下來,使用渲染目標繪製矩形。
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,表示繪製命令是否成功。
步驟 6:釋放資源
當沒有其他畫面格要繪製,或收到 D2DERR_RECREATE_TARGET 錯誤時,請釋放轉譯目標及其建立的任何裝置。
SafeRelease(pRT);
SafeRelease(pBlackBrush);
當您的應用程式使用 Direct2D 資源完成時(例如即將結束時),請釋放 Direct2D 處理站。
SafeRelease(pD2DFactory);
建立簡單的 Direct2D 應用程式
本主題中的程式代碼會顯示 Direct2D 應用程式的基本元素。 為了簡潔起見,本主題會省略應用程式架構和錯誤處理程序代碼,這是撰寫良好應用程式的特性。 如需更詳細的逐步解說,示範建立簡單 Direct2D 應用程式的完整程式碼,並示範最佳設計作法,請參閱 建立簡單的 Direct2D 應用程式。
相關主題