Direct2D API 概觀
Direct2D 提供類似 Direct3D 的 API,以搭配 C 或 C++ 使用。 API 會公開各種繪圖相關功能:
- 使用 Direct2D、Direct3D 或 GDI 呈現顯示和螢幕外轉譯的目標。
- 用於管理繪圖狀態的物件,例如座標空間轉換和反鋸齒模式。
- 幾何資料的標記法,以及幾何處理的函式。
- 點陣圖、幾何和文字的轉譯功能。
- 布建以使用 GDI 或 Direct3D 建立的圖形化內容。
本主題提供組成 Direct2D API 的物件概觀。 它包含下列區段:
Direct2D 標頭檔
Direct2D API 是由下列標頭檔所定義。
標頭檔 | 描述 |
---|---|
d2d1.h | 定義主要 Direct2D API 的 C 和 C++ 版本。 |
d2d1helper.h | 定義 C++ 協助程式函式、類別和結構。 |
d2dbasetypes.h | 定義 Direct2D 的繪圖基本類型,例如點和矩形。 此標頭隨附于 d2d1.h。 |
d2derr.h | 定義 Direct2D 的錯誤碼。 此標頭隨附于 d2d1.h。 |
d2d1_1.h | 定義適用于 Windows 8 和更新版本之主要 Direct2D API 的 C 和 C++ 版本。 |
d2d1_1helper.h | 定義適用于 Windows 8 和更新版本的 C++ 協助程式函式、類別和結構。 |
d2d1effects.h | 定義適用于 Windows 8 和更新版本的 Direct2D API 之映射效果部分的 C 和 C++ 版本。 |
d2d1effecthelpers.h | 定義適用于 Windows 8 和更新版本之 Direct2D API 之影像效果部分的 C++ 協助程式函式、類別和結構。 |
若要使用 Direct2D,您的應用程式應該包含 d2d1.h 標頭檔。
若要編譯 Direct2D 應用程式,請將 d2d1.lib 新增至程式庫清單。 您可以在 適用于 Windows 7 的 Windows 軟體發展工具組 (SDK) 中找到 d2d1.h 和 d2d1.lib。
下列各節說明 Direct2D API 所提供的一些常見介面。
Direct2D 介面
Direct2D API 的根目錄是 ID2D1Factory 和 ID2D1Resource 介面。 ID2D1Factory物件會建立ID2D1Resource物件,並做為使用 Direct2D 的起點。 所有其他 Direct2D 物件都繼承自 ID2D1Resource 介面。 Direct2D 資源有兩種類型:裝置獨立資源和裝置相依資源。
- 與裝置無關的資源不會與特定轉譯裝置相關聯,而且可以在應用程式存留期間保存。
- 裝置相依資源會與特定的轉譯裝置相關聯,並在移除該裝置時停止運作。
(如需資源和資源分享的詳細資訊,請參閱 資源概觀.)
ID2D1Factory 介面
ID2D1Factory介面是使用 Direct2D 的起點。 您可以使用 ID2D1Factory 來具現化 Direct2D 資源。 若要建立 ID2D1Factory,您可以使用其中一個 CreateFactory 方法。
處理站會定義一組可產生下列繪圖資源的建立資源 方法:
- 轉譯目標是轉譯繪圖命令的物件。
- 繪圖狀態欄塊是儲存繪圖狀態資訊的物件,例如目前的轉換和反鋸齒模式。
- 幾何是代表簡單且可能複雜圖形的物件。
處理站可建立的最實用物件之一是 ID2D1RenderTarget,如下一節所述。
轉譯目標
轉譯目標是繼承自 ID2D1RenderTarget 介面的資源。 轉譯目標會建立繪圖的資源,並執行繪圖作業。 有幾種轉譯目標可用來以下列方式轉譯圖形:
- ID2D1HwndRenderTarget 物件會將內容轉譯至視窗。
- ID2D1DCRenderTarget 物件會轉譯至 GDI 裝置內容。
- 點陣圖轉譯目標物件會將內容轉譯為螢幕外點陣圖。
- DXGI 轉譯目標物件會轉譯為 DXGI 表面,以搭配 Direct3D 使用。
因為轉譯目標與特定的轉譯裝置相關聯,所以它是裝置相依的資源,如果移除裝置,就會停止運作。
轉譯目標功能
您可以指定轉譯目標是否應該使用硬體加速,以及本機或遠端電腦是否應該轉譯遠端顯示器。 您可以針對別名或反鋸齒轉譯設定轉譯目標。 對於具有大量基本類型的轉譯場景,開發人員也可以在別名模式中轉譯 2D 圖形,並使用 D3D 多重取樣反鋸齒來達到更大的延展性。
轉譯目標也可以將繪圖作業分組為 ID2D1Layer 介面所代表的圖層。 圖層對於在轉譯框架時,收集要組合在一起的繪圖作業很有用。 在某些情況下,這可以是轉譯為點陣圖轉譯目標的實用替代方法,然後重複使用點陣圖內容,因為階層式配置成本低於 ID2D1BitmapRenderTarget。
轉譯目標可以建立與本身相容的新轉譯目標,這對於中繼螢幕外轉譯很有用,同時保留原始上設定的各種轉譯目標屬性。
您也可以在 Direct2D 轉譯目標上使用 GDI 來轉譯,方法是在ID2D1GdiInteropRenderTarget的轉譯目標上呼叫QueryInterface,其上具有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。
繪圖資源
下列各節說明轉譯目標和處理站介面可以建立的一些資源。
筆刷
ID2D1Brush介面所代表的筆刷是由轉譯目標所建立的裝置相依資源,其輸出會繪製區域。 不同的筆刷有不同類型的輸出。 有些筆刷會以純色繪製區域,其他則使用漸層或影像。 Direct2D 提供四種類型的筆刷:
- ID2D1SolidColorBrush 繪製具有純色的區域。
- ID2D1LinearGradientBrush 會繪製具有線性漸層的區域,以線上條上混合兩個或多個色彩,也就是漸層軸。
- ID2D1RadialGradientBrush 會繪製具有星形漸層的區域,其會混合兩個或更多色彩繞橢圓形。
- ID2D1BitmapBrush 會繪製具有點陣圖的區域。
若要建立筆刷,您可以使用其中一個ID2D1RenderTarget::Create*Type > * < Brush 方法,例如CreateRadialGradientBrush。 筆刷可以搭配轉譯目標 Draw 和 Fill 方法使用,以繪製圖形筆劃或外框,或做為不透明度遮罩。
如需筆刷的詳細資訊,請參閱 筆刷概觀。
幾何
除了基本繪圖基本類型,例如點、矩形和橢圓形之外, Direct2D 還提供 ID2D1Geometry 介面來描述簡單和複雜的圖形。 繼承自 ID2D1Geometry 的介面會定義不同類型的圖形,例如代表矩形的 ID2D1RectangleGeometry 、用於代表圓角矩形的 ID2D1RoundedRectangleGeometry ,以及代表橢圓形的 ID2D1EllipseGeometry 。
您可以使用 ID2D1GeometrySink 介面來建立更複雜的圖形,以指定一系列由線條、曲線和弧線組成的圖形。 ID2D1GeometrySink會傳遞至ID2D1PathGeometry的 Open 方法,以產生複雜的幾何。 ID2D1SimplifiedGeometrySink也可以與 DirectWrite API 搭配使用,以擷取格式化文字的路徑大綱以進行轉譯。
幾何介面提供方法,可藉由擴大或簡化現有的幾何,或產生多個幾何的交集或聯集,來操作圖形。 它們也會提供方法來判斷幾何是否交集或重迭、擷取界限資訊、計算幾何的區域或長度,以及沿著幾何插補位置。 Direct2D 也可讓您建立從幾何鑲嵌的三角形網格。
若要建立幾何,您可以使用其中一個 ID2D1Factory::Create* < Type > *Geometry 方法,例如 CreatePathGeometry。 幾何是與裝置無關的資源。
若要轉譯幾何,您可以使用轉譯目標的 DrawGeometry 和 FillGeometry 方法。
如需幾何的詳細資訊,請參閱 幾何概觀。
點陣圖
Direct2D 不提供載入或儲存點陣圖的方法;相反地,它可讓您使用 Windows 映像處理元件 (WIC) 建立點陣圖。 您可以使用 WIC 載入點陣圖資源,然後用來透過ID2D1RenderTarget::CreateBitmapFromWicBitmap方法建立ID2D1Bitmap。
您也可以從透過其他方式設定的記憶體內部資料建立點陣圖。 建立點陣圖之後,可以透過轉譯目標 DrawBitmap 方法或使用點陣圖筆刷繪製。
由於在硬體轉譯目標上建立點陣圖資源通常是昂貴的作業,因此 Direct2D 可以使用 CopyFromBitmap、 CopyFromRenderTarget和 CopyFromMemory 方法來更新點陣圖 (或部分點陣圖) 的內容。 使用這些方法可能會節省與其他 GPU 紋理配置相關聯的成本。
繪圖文字
Direct2D 的設計目的是要處理新文字 API 的文字作業,DirectWrite。 若要簡化使用DirectWrite API,轉譯目標提供三種方法來轉譯DirectWrite文字資源:DrawText、DrawTextLayout和DrawGlyphRun。 由於 Direct2D 會針對 ClearType 文字轉譯程式使用 GPU,因此 Direct2D 提供比 GDI 低的 CPU 使用量,以及較佳的延展性,因為有更多 GPU 處理能力可供使用。
ID2D1RenderTarget::D rawText是專為最簡單的案例所設計,涉及以最少格式呈現 Unicode 文字字串。 透過 ID2D1RenderTarget::D rawTextLayout 方法提供更複雜的版面配置和印刷樣式彈性,此方法會使用 IDWriteTextLayout 物件來指定要轉譯的內容和格式。 IDWriteTextLayout 可讓您指定文字子字串和其他進階印刷樣式選項的個別格式設定。
對於需要精確控制字元層級配置的情況,ID2D1RenderTarget::D rawGlyphRun方法可以搭配DirectWrite所提供的度量設備使用。
若要使用 DirectWrite API,請包含 dwrite.h 標頭。 如同 Direct2D,DirectWrite會使用Factory IDWriteFactory來建立文字物件。 使用DWriteCreateFactory函式來建立處理站,然後使用其 Create 方法來建立DirectWrite資源 (,例如IDWriteTextFormat) 。
如需DirectWrite的詳細資訊,請參閱DirectWrite簡介主題。
Direct2D 基本類型
Direct2D 會定義一組類似于其他繪圖 API 所提供的基本類型。 它提供色彩結構、用於執行轉換的矩陣結構,以及點、矩形、橢圓形和大小結構的浮點和整數版本。 通常,您會使用這些結構的浮點版本。
您不使用 Factory 或轉譯目標來具現化 Direct2D 基本類型。 您可以直接建立它們,或使用 d2d1helper.h 中定義的協助程式方法來建立它們。
相關主題