共用方式為


使用 Direct2D 繪製

建立圖形資源之後,您就可以開始繪製。

繪製橢圓形

Circle程式會執行非常簡單的繪圖邏輯:

  1. 以純色填滿背景。
  2. 繪製填滿的圓形。

圓形程式的螢幕擷取畫面。

因為轉譯目標是視窗 (,而不是點陣圖或其他螢幕外表面) ,所以繪圖會回應 WM_PAINT 訊息。 下列程式碼顯示 Circle 程式的視窗程式。

LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_PAINT:
            OnPaint();
            return 0;

         // Other messages not shown...
    }
    return DefWindowProc(m_hwnd, uMsg, wParam, lParam);
}

以下是繪製圓形的程式碼。

void MainWindow::OnPaint()
{
    HRESULT hr = CreateGraphicsResources();
    if (SUCCEEDED(hr))
    {
        PAINTSTRUCT ps;
        BeginPaint(m_hwnd, &ps);
     
        pRenderTarget->BeginDraw();

        pRenderTarget->Clear( D2D1::ColorF(D2D1::ColorF::SkyBlue) );
        pRenderTarget->FillEllipse(ellipse, pBrush);

        hr = pRenderTarget->EndDraw();
        if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET)
        {
            DiscardGraphicsResources();
        }
        EndPaint(m_hwnd, &ps);
    }
}

ID2D1RenderTarget介面會用於所有繪圖作業。 程式的 OnPaint 方法會執行下列動作:

  1. ID2D1RenderTarget::BeginDraw方法會發出繪圖開頭的訊號。
  2. ID2D1RenderTarget::Clear方法會以純色填滿整個轉譯目標。 色彩會以 D2D1_COLOR_F 結構的形式提供。 您可以使用 D2D1::ColorF 類別來初始化 結構。 如需詳細資訊,請參閱 在 Direct2D 中使用色彩
  3. ID2D1RenderTarget::FillEllipse方法會使用指定的筆刷繪製填滿橢圓形。 橢圓形是由中心點和 x 和 y 弧度所指定。 如果 x- 和 y 弧度相同,則結果為圓形。
  4. ID2D1RenderTarget::EndDraw方法會發出此框架繪圖完成的訊號。 所有繪圖作業都必須在 呼叫 BeginDrawEndDraw 之間放置

BeginDrawClearFillEllipse方法全都有void傳回類型。 如果在執行任何這些方法期間發生錯誤,錯誤會透過 EndDraw 方法的傳回值發出訊號。 方法 CreateGraphicsResources 會顯示在 建立 Direct2D 資源主題中。 這個方法會建立轉譯目標和純色筆刷。

裝置可能會緩衝繪圖命令,並順延強制,直到呼叫 EndDraw 為止。 您可以藉由呼叫 ID2D1RenderTarget::Flush,強制裝置執行任何擱置的繪圖命令。 不過,排清可能會降低效能。

處理裝置遺失

當您的程式正在執行時,您使用的圖形裝置可能會變成無法使用。 例如,如果顯示器解析度變更,或使用者移除顯示介面卡,裝置可能會遺失。 如果裝置遺失,轉譯目標也會變成無效,以及與裝置相關聯的任何裝置相依資源。 Direct2D 會從EndDraw方法傳回錯誤碼D2DERR_RECREATE_TARGET,以向遺失的裝置發出訊號。 如果您收到此錯誤碼,您必須重新建立轉譯目標和所有裝置相依資源。

若要捨棄資源,只要釋放該資源的介面即可。

void MainWindow::DiscardGraphicsResources()
{
    SafeRelease(&pRenderTarget);
    SafeRelease(&pBrush);
}

建立資源可能是昂貴的作業,因此請勿針對每個 WM_PAINT 訊息重新建立您的資源。 建立資源一次,並快取資源指標,直到資源因為裝置遺失而失效,或直到您不再需要該資源為止。

Direct2D 轉譯迴圈

無論您繪製什麼,程式都應該執行類似下列的迴圈。

  1. 建立與裝置無關的資源。
  2. 轉譯場景。
    1. 檢查有效的轉譯目標是否存在。 如果沒有,請建立轉譯目標和裝置相依資源。
    2. 呼叫 ID2D1RenderTarget::BeginDraw
    3. 發出繪圖命令。
    4. 呼叫 ID2D1RenderTarget::EndDraw
    5. 如果 EndDraw 傳回 D2DERR_RECREATE_TARGET,請捨棄轉譯目標和裝置相依的資源。
  3. 每當您需要更新或重新繪製場景時,重複步驟 2。

如果轉譯目標是視窗,每當視窗收到 WM_PAINT 訊息時,就會發生步驟 2。

這裡顯示的迴圈會捨棄裝置相依的資源,並在下一個迴圈開頭重新建立裝置, (步驟 2a) 。

下一個

DPI 和Device-Independent圖元