共用方式為


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 方法。

工廠會定義一組 CreateResource 方法,可產生下列繪圖資源:

  • 渲染目標是渲染繪圖命令的物件。
  • 繪圖狀態區塊是儲存繪圖狀態資訊的物件,例如當前的變換和反鋸齒模式。
  • 幾何是代表簡單且可能複雜圖形的物件。

處理站可以建立的最有用物件之一是 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 的介面 定義不同類型的圖形, 例如代表矩形的 ID2D1RectangleGeometryID2D1RoundedRectangleGeometry 代表圓角矩形,以及代表橢圓形的 ID2D1EllipseGeometry

您可以使用 ID2D1GeometrySink 介面來建立更複雜的圖形,以指定由線條、曲線和弧線組成的一系列圖形。 ID2D1GeometrySink 傳遞到 ID2D1PathGeometry 的 Open 方法,以生成複雜的幾何圖形。 ID2D1SimplifiedGeometrySink 也可以與 DirectWrite API 搭配使用,擷取格式化文字的路徑外框以進行藝術轉譯。

幾何介面提供方法來操作圖形,藉由擴大或簡化現有的幾何圖形,或產生多個幾何圖形的交集或聯集。 它們也提供方法來判斷幾何是否交集或重疊、擷取界限資訊、計算幾何的區域或長度,以及沿著幾何插補位置。 Direct2D 還提供了從幾何圖形進行細分以建立三角形網格的功能。

若要建立幾何,您可以使用其中一個 ID2D1Factory::Create*<Type>*Geometry 方法,例如 CreatePathGeometry。 幾何是裝置無關的資源。

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

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

點陣圖

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

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

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

繪圖文字

Direct2D 的設計目的是要處理新文字 API DirectWrite 的文字作業。 為了讓使用 DirectWrite API 更簡單,轉譯目標提供三種方法來轉譯 DirectWrite 文字資源:DrawTextDrawTextLayout,以及 DrawGlyphRun。 因為 Direct2D 會針對 ClearType 文字轉譯程式使用 GPU,因此 Direct2D 針對文字作業提供比 GDI 低的 CPU 使用量,以及較佳的延展性,因為可以使用更多的 GPU 處理能力。

ID2D1RenderTarget::DrawText 是為最簡單的情境所設計,涉及用最少的格式來渲染 Unicode 文字字串。 透過 ID2D1RenderTarget::DrawTextLayout 方法提供更複雜的版面配置和排版彈性,此方法會使用 IDWriteTextLayout 物件來指定要轉譯的內容和格式。 IDWriteTextLayout 可讓您指定文字子字串和其他進階印刷樣式選項的個別格式設定。

對於需要精確控制字形層級佈局的情況,ID2D1RenderTarget::DrawGlyphRun 方法可以搭配 DirectWrite所提供的測量功能使用。

若要使用 DirectWrite API,請包含 dwrite.h 標頭。 如同 Direct2D,DirectWrite 會使用 Factory IDWriteFactory 來建立文字物件。 使用 DWriteCreateFactory 函式來建立 Factory,然後使用其 Create 方法來建立 DirectWrite 資源(例如 IDWriteTextFormat)。

如需 DirectWrite 的詳細資訊,請參閱 DirectWrite 簡介 主題。

Direct2D 基本類型

Direct2D 定義一組基本類型,類似於其他繪圖 API 所提供的基本類型。 它提供色彩結構、用於執行轉換的矩陣結構,以及點、矩形、省略號和大小結構的浮點和整數版本。 通常,您可以使用這些結構的浮點版本。

您不使用處理站或轉譯目標來具現化 Direct2D 基本類型。 您可以直接建立它們,或使用 d2d1helper.h 中定義的協助程式方法來建立它們。

Direct2D 參考

DirectWrite HelloWorld

介紹 DirectWrite

資源概觀

Windows 映射元件 (WIC)