轉譯目標概觀
轉譯目標是繼承自 ID2D1RenderTarget 介面的資源。 轉譯目標會建立繪製的資源,並執行實際的繪圖作業。 本主題描述不同類型的 Direct2D 轉譯目標,以及如何使用它們。
轉譯目標
轉譯目標是繼承自 ID2D1RenderTarget 介面的資源。 轉譯目標會建立繪製的資源,並執行實際的繪圖作業。 有數種轉譯目標可用來以下列方式轉譯圖形:
- ID2D1HwndRenderTarget 物件會將內容轉譯至視窗。
- ID2D1DCRenderTarget 物件會轉譯為 GDI 裝置內容。
- 點陣圖轉譯目標物件會將內容轉譯為螢幕外點陣圖。
- DXGI 轉譯目標物件會轉譯為 DXGI 表面,以便與 Direct3D 搭配使用。
因為轉譯目標與特定轉譯裝置相關聯,所以它是裝置相依的資源,如果移除裝置,就會停止運作。
轉譯目標功能
您可以指定轉譯目標是否使用硬體加速,以及遠端顯示器是由本機或遠端電腦轉譯。 您可以針對別名或反鋸齒轉譯設定轉譯目標。 針對具有大量基本類型的轉譯場景,開發人員也可以在別名模式中轉譯 2D 圖形,並使用 D3D 多重取樣反鋸齒來達到更高的延展性。
轉譯目標也可以將繪圖作業分組為 ID2D1Layer 介面所代表的圖層。 圖層對於在轉譯框架時,收集要複合在一起的繪圖作業很有用。 在某些情況下,這可以是轉譯為點陣圖轉譯目標的實用替代方案,然後重複使用點陣圖內容,因為階層式配置成本低於 ID2D1BitmapRenderTarget。
轉譯目標可以建立與本身相容的新轉譯目標,這適用于中繼螢幕外轉譯,同時保留原始上設定的各種轉譯目標屬性。
您也可以在ID2D1GdiInteropRenderTarget的轉譯目標上呼叫QueryInterface,以在 Direct2D 轉譯目標上使用 GDI 轉譯目標來轉譯,其上具有GetDC和ReleaseDC方法,可用來擷取 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;
}
此範例已省略程式碼。