Share via


轉譯目標概觀

轉譯目標是繼承自 ID2D1RenderTarget 介面的資源。 轉譯目標會建立繪製的資源,並執行實際的繪圖作業。 本主題描述不同類型的 Direct2D 轉譯目標,以及如何使用它們。

轉譯目標

轉譯目標是繼承自 ID2D1RenderTarget 介面的資源。 轉譯目標會建立繪製的資源,並執行實際的繪圖作業。 有數種轉譯目標可用來以下列方式轉譯圖形:

  • ID2D1HwndRenderTarget 物件會將內容轉譯至視窗。
  • ID2D1DCRenderTarget 物件會轉譯為 GDI 裝置內容。
  • 點陣圖轉譯目標物件會將內容轉譯為螢幕外點陣圖。
  • DXGI 轉譯目標物件會轉譯為 DXGI 表面,以便與 Direct3D 搭配使用。

因為轉譯目標與特定轉譯裝置相關聯,所以它是裝置相依的資源,如果移除裝置,就會停止運作。

轉譯目標功能

您可以指定轉譯目標是否使用硬體加速,以及遠端顯示器是由本機或遠端電腦轉譯。 您可以針對別名或反鋸齒轉譯設定轉譯目標。 針對具有大量基本類型的轉譯場景,開發人員也可以在別名模式中轉譯 2D 圖形,並使用 D3D 多重取樣反鋸齒來達到更高的延展性。

轉譯目標也可以將繪圖作業分組為 ID2D1Layer 介面所代表的圖層。 圖層對於在轉譯框架時,收集要複合在一起的繪圖作業很有用。 在某些情況下,這可以是轉譯為點陣圖轉譯目標的實用替代方案,然後重複使用點陣圖內容,因為階層式配置成本低於 ID2D1BitmapRenderTarget

轉譯目標可以建立與本身相容的新轉譯目標,這適用于中繼螢幕外轉譯,同時保留原始上設定的各種轉譯目標屬性。

您也可以在ID2D1GdiInteropRenderTarget的轉譯目標上呼叫QueryInterface,以在 Direct2D 轉譯目標上使用 GDI 轉譯目標來轉譯,其上具有GetDCReleaseDC方法,可用來擷取 GDI 裝置內容。 只有在使用 設定D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE 旗標來建立轉譯目標時,才能透過 GDI 轉譯。 這適用于主要使用 Direct2D 轉譯但具有擴充性模型或其他需要使用 GDI 轉譯之舊版內容的應用程式。 如需詳細資訊,請參閱 Direct2D 和 GDI 交互操作概觀

轉譯目標資源

就像處理站一樣,轉譯目標可以建立繪圖資源。 轉譯目標建立的任何資源都是裝置相依資源, (就像轉譯目標) 一樣。 轉譯目標可以建立下列類型的資源:

  • 點陣圖
  • 筆刷
  • 圖層
  • 網狀

繪圖命令

若要轉譯內容,您可以使用轉譯目標繪圖方法。 開始繪製之前,請先呼叫 ID2D1RenderTarget::BeginDraw 方法。 完成繪圖之後,您會呼叫 ID2D1RenderTarget::EndDraw 方法。 在這些呼叫之間,您可以使用 Draw 和 Fill 方法來轉譯繪圖資源。 大部分的 Draw 和 Fill 方法都會採用圖形 (基本或幾何) 和筆刷來填滿或大綱圖形。

轉譯目標提供裁剪、套用不透明度遮罩,以及轉換座標空間的方法。

Direct2D 使用左手座標系統:正 X 軸值會往右繼續,正 y 軸值會往下繼續。

錯誤處理

轉譯目標繪圖命令不會指出所要求的作業是否成功。 若要瞭解是否有繪圖錯誤,請呼叫轉譯目標 Flush 方法或 EndDraw 方法來取得 HRESULT

範例:將內容轉譯為視窗

下列範例會使用 CreateHwndRenderTarget 方法來建立 ID2D1HwndRenderTarget

RECT rc;
GetClientRect(m_hwnd, &rc);

D2D1_SIZE_U size = D2D1::SizeU(
    rc.right - rc.left,
    rc.bottom - rc.top
    );

// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(m_hwnd, size),
    &m_pRenderTarget
    );

下一個範例會使用 ID2D1HwndRenderTarget 將文字繪製到視窗。

//  Called whenever the application needs to display the client
//  window. This method writes "Hello, World"
//
//  Note that this function will automatically discard device-specific
//  resources if the Direct3D device disappears during function
//  invocation, and will recreate the resources the next time it's
//  invoked.
//
HRESULT DemoApp::OnRender()
{
    HRESULT hr;

    hr = CreateDeviceResources();

    if (SUCCEEDED(hr))
    {
        static const WCHAR sc_helloWorld[] = L"Hello, World!";

        // Retrieve the size of the render target.
        D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();

        m_pRenderTarget->BeginDraw();

        m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());

        m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

        m_pRenderTarget->DrawText(
            sc_helloWorld,
            ARRAYSIZE(sc_helloWorld) - 1,
            m_pTextFormat,
            D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height),
            m_pBlackBrush
            );

        hr = m_pRenderTarget->EndDraw();

        if (hr == D2DERR_RECREATE_TARGET)
        {
            hr = S_OK;
            DiscardDeviceResources();
        }
    }

    return hr;
}

此範例已省略程式碼。