呈現目標、裝置和資源
轉 譯目標 只是程序繪製的位置。 一般而言,轉譯目標是視窗(特別是視窗的工作區)。 它也可以是記憶體中未顯示的點陣圖。 轉譯目標是由 ID2D1RenderTarget 介面表示。
裝置是一種抽象概念,代表實際繪製圖元的任何專案。 硬體裝置會使用 GPU 來提升效能,而軟體裝置則使用 CPU。 應用程式不會建立裝置。 相反地,當應用程式建立轉譯目標時,會隱含地建立裝置。 每個轉譯目標都會與特定裝置相關聯,無論是硬體還是軟體。
資源是程式用於繪製的物件。 以下是 Direct2D 中定義的一些資源範例:
- 筆刷。 控制繪製線條和區域的方式。 筆刷類型包括純色筆刷和漸層筆刷。
- 筆劃樣式。 控制線條的外觀,例如虛線或實心。
- 幾何。 表示線條和曲線的集合。
- 網格。 由三角形構成的圖形。 網格數據可以直接由 GPU 取用,與幾何數據不同,在轉譯之前必須先轉換。
轉譯目標也會被視為一種資源類型。
某些資源受益於硬體加速。 此類型的資源一律會與特定裝置相關聯,無論是硬體 (GPU) 或軟體 (CPU)。 這種類型的資源稱為 裝置相依。 筆刷和網格是裝置相依資源的範例。 如果裝置無法使用,則必須為新的裝置重新建立資源。
不論使用何種裝置,其他資源都會保留在CPU記憶體中。 這些資源與 裝置無關,因為它們與特定裝置無關。 當裝置變更時,不需要重新建立與裝置無關的資源。 筆劃樣式和幾何是裝置無關的資源。
每個資源的 Windows 檔會指出資源是裝置相依或與裝置無關。 每個資源類型都是由衍生自 ID2D1Resource的介面來表示。 例如,筆刷是由 ID2D1Brush 介面表示。
Direct2D Factory 物件
使用 Direct2D 的第一個步驟是建立 Direct2D Factory 對象的實例。 在計算機程序設計中, Factory 是建立其他對象的物件。 Direct2D Factory 會建立下列類型的物件:
- 轉譯目標。
- 裝置無關的資源,例如筆劃樣式和幾何。
裝置相依的資源,例如筆刷和位圖,是由轉譯目標物件所建立。
若要建立 Direct2D Factory 物件,請呼叫 D2D1CreateFactory 函式。
ID2D1Factory *pFactory = NULL;
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory);
第一個參數是指定建立選項的旗標。 D2D1_FACTORY_TYPE_SINGLE_THREADED旗標表示您不會從多個線程呼叫 Direct2D。 若要支援多個線程的呼叫,請指定 D2D1_FACTORY_TYPE_MULTI_THREADED。 如果您的程式使用單一線程呼叫 Direct2D,則單個線程選項會更有效率。
D2D1CreateFactory 函式的第二個參數會接收 ID2D1Factory 介面的指標。
您應該在第一 個WM_PAINT 訊息之前建立 Direct2D Factory 物件。 WM_CREATE訊息處理程式是建立處理站的好位置:
case WM_CREATE:
if (FAILED(D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED, &pFactory)))
{
return -1; // Fail CreateWindowEx.
}
return 0;
建立 Direct2D 資源
Circle 程式會使用下列裝置相依資源:
- 與應用程式視窗相關聯的轉譯目標。
- 繪製圓形的純色筆刷。
每一個資源都會以 COM 介面表示:
- ID2D1HwndRenderTarget 介面代表轉譯目標。
- ID2D1SolidColorBrush 介面代表筆刷。
Circle 程式會將這些介面的 MainWindow
指標儲存為 類別的成員變數:
ID2D1HwndRenderTarget *pRenderTarget;
ID2D1SolidColorBrush *pBrush;
下列程式代碼會建立這兩個資源。
HRESULT MainWindow::CreateGraphicsResources()
{
HRESULT hr = S_OK;
if (pRenderTarget == NULL)
{
RECT rc;
GetClientRect(m_hwnd, &rc);
D2D1_SIZE_U size = D2D1::SizeU(rc.right, rc.bottom);
hr = pFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(m_hwnd, size),
&pRenderTarget);
if (SUCCEEDED(hr))
{
const D2D1_COLOR_F color = D2D1::ColorF(1.0f, 1.0f, 0);
hr = pRenderTarget->CreateSolidColorBrush(color, &pBrush);
if (SUCCEEDED(hr))
{
CalculateLayout();
}
}
}
return hr;
}
若要建立視窗的轉譯目標,請在 Direct2D Factory 上呼叫 ID2D1Factory::CreateHwndRenderTarget 方法。
- 第一個參數會指定任何類型的轉譯目標通用的選項。 在這裡,我們會藉由呼叫 Helper 函式 D2D1::RenderTargetProperties 來傳入預設選項。
- 第二個參數會指定視窗的句柄加上轉譯目標的大小,以像素為單位。
- 第三個 參數會接收ID2D1HwndRenderTarget 指標。
若要建立純色筆刷,請在轉譯目標上呼叫 ID2D1RenderTarget::CreateSolidColorBrush 方法。 色彩會指定為 D2D1_COLOR_F 值。 如需 Direct2D 中色彩的詳細資訊,請參閱 在 Direct2D 中使用色彩。
此外,請注意,如果轉譯目標已經存在,此方法 CreateGraphicsResources
會 傳回S_OK 而不執行任何動作。 此設計的原因將會在下一個主題中變得清楚。
下一步