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 的根目錄是 ID2D1FactoryID2D1Resource 介面。 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,其上具有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

繪圖資源

下列各節說明轉譯目標和處理站介面可以建立的一些資源。

筆刷

ID2D1Brush介面所代表的筆刷是由轉譯目標所建立的裝置相依資源,其輸出會繪製區域。 不同的筆刷有不同類型的輸出。 有些筆刷會以純色繪製區域,其他則使用漸層或影像。 Direct2D 提供四種類型的筆刷:

若要建立筆刷,您可以使用其中一個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。 幾何是與裝置無關的資源。

若要轉譯幾何,您可以使用轉譯目標的 DrawGeometryFillGeometry 方法。

如需幾何的詳細資訊,請參閱 幾何概觀

點陣圖

Direct2D 不提供載入或儲存點陣圖的方法;相反地,它可讓您使用 Windows 映像處理元件 (WIC) 建立點陣圖。 您可以使用 WIC 載入點陣圖資源,然後用來透過ID2D1RenderTarget::CreateBitmapFromWicBitmap方法建立ID2D1Bitmap

您也可以從透過其他方式設定的記憶體內部資料建立點陣圖。 建立點陣圖之後,可以透過轉譯目標 DrawBitmap 方法或使用點陣圖筆刷繪製。

由於在硬體轉譯目標上建立點陣圖資源通常是昂貴的作業,因此 Direct2D 可以使用 CopyFromBitmapCopyFromRenderTargetCopyFromMemory 方法來更新點陣圖 (或部分點陣圖) 的內容。 使用這些方法可能會節省與其他 GPU 紋理配置相關聯的成本。

繪圖文字

Direct2D 的設計目的是要處理新文字 API 的文字作業,DirectWrite。 若要簡化使用DirectWrite API,轉譯目標提供三種方法來轉譯DirectWrite文字資源:DrawText、DrawTextLayoutDrawGlyphRun 由於 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 中定義的協助程式方法來建立它們。

Direct2D 參考

DirectWrite HelloWorld

DirectWrite簡介

資源概觀

Windows 影像處理元件 (WIC)