Direct2D 快速入門

Direct2D 是用來建立 2D 圖形的原生程式碼立即模式 API。 本主題說明如何在一般 Win32 應用程式中使用 Direct2D 來繪製至 HWND

注意

如果您想要建立使用 Direct2D 的 Windows 市集應用程式,請參閱適用于 Windows 8 主題的 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 應用程式

建立簡單的 Direct2D 應用程式