D2D1_FILL_MODE列舉 (d2d1.h)

指定如何結合幾何或圖形的交集區域,以形成複合幾何的區域。

Syntax

typedef enum D2D1_FILL_MODE {
  D2D1_FILL_MODE_ALTERNATE = 0,
  D2D1_FILL_MODE_WINDING = 1,
  D2D1_FILL_MODE_FORCE_DWORD = 0xffffffff
} ;

常數

 
D2D1_FILL_MODE_ALTERNATE
值: 0
透過從該點到任何方向的無限大繪製光線,然後計算指定圖案中光線交叉的路徑區段數目,判斷某個點是否在填滿區域中。 如果這個數位是奇數,則點位於填滿區域中;即使如此,點位於填滿區域之外。
D2D1_FILL_MODE_WINDING
值: 1
判斷某個點是否在路徑的填滿區域中,方法是繪製從該點到無限大的任何方向的光線,然後檢查圖形區段跨越光線的位置。 從零開始,每次區段從左至右交叉光線時新增一個,每次路徑區段從右至左交叉光線時減一個,只要從光線的角度看到左到右。 計算交叉之後,如果結果為零,則點位於路徑外。 否則,它位於路徑內。
D2D1_FILL_MODE_FORCE_DWORD
值: 0xffffffff

備註

使用CreateGeometryGroup方法建立ID2D1GeometryGroup時,或使用ID2D1SimplifiedGeometrySink 的填滿模式來修改 ID2D1SimplifiedGeometrySink,請使用 D2D1_FILL_MODE 列舉。

Direct2D 會使用這個列舉所指定的兩種填滿模式之一來填滿路徑的內部: D2D1_FILL_MODE_ALTERNATE (替代) 或 D2D1_FILL_MODE_WINDING () 。 由於模式會決定如何填滿封閉圖形的內部,因此所有圖形在填滿時都會被視為封閉式。 如果圖形中的線段有間距,請繪製虛線來關閉它。

若要查看線圈和替代填滿模式之間的差異,假設您有四個圓圈具有相同的中心和不同的半徑,如下圖所示。 第一個的半徑為 25、第二個 50、第三個 75 和第四個 100。

具有不同半徑值的四個同心圓圖例 下圖顯示使用替代填滿模式填滿的圖形。 請注意,中央和第三個環形未填滿。 這是因為從這兩個環形任一點繪製的光線會通過偶數的區段。 內含第二個和第四個環形的同心圓圖例 下圖說明此程式。 同心圓的圖例,其中包含第二個和第三個環形中的點,以及從每個點延伸的兩個任意光線下圖顯示指定線圈填滿模式時,如何填滿相同的圖形。 內含所有環形的同心圓圖例 請注意,所有環形都會填滿。 這是因為所有線段都以相同的方向執行,因此從任何點繪製的光線會跨越一或多個線段,而交叉的總和不會等於零。

下圖說明此程式。 紅色箭號代表繪製線段的方向,黑色箭號代表從最內層環形點執行的任意光線。 從零開始,針對光線交叉的每個區段,每個順時針交集都會加入一個 值。 所有點都位於此圖中的填滿區域,因為計數不等於零。

同心圓的圖例,其中來自第一個環形內的光線跨越所有四個環形

範例

下列程式碼範例會建立使用上述圖例的幾何群組。 程式碼會先宣告 geometry 物件的陣列。 這些物件是具有下列弧度的四個同心圓:25、50、75 和 100。 然後在ID2D1Factory物件上呼叫CreateGeometryGroup、傳入D2D1_FILL_MODE_ALTERNATE、要新增至 geometry 群組的 geometry 物件陣列,以及此陣列中的元素數目。

HRESULT DemoApp::CreateGeometryResources()
{
    HRESULT hr;

    const D2D1_ELLIPSE ellipse1 = D2D1::Ellipse(
        D2D1::Point2F(105.0f, 105.0f),
        25.0f,
        25.0f
        );

    hr = m_pD2DFactory->CreateEllipseGeometry(
        ellipse1,
        &m_pEllipseGeometry1
        );

    if (SUCCEEDED(hr))
    {
        const D2D1_ELLIPSE ellipse2 = D2D1::Ellipse(
            D2D1::Point2F(105.0f, 105.0f),
            50.0f,
            50.0f
            );

        hr = m_pD2DFactory->CreateEllipseGeometry(
            ellipse2,
            &m_pEllipseGeometry2
            );
    }

    if (SUCCEEDED(hr))
    {

        const D2D1_ELLIPSE ellipse3 = D2D1::Ellipse(
            D2D1::Point2F(105.0f, 105.0f),
            75.0f,
            75.0f
            );

        hr = m_pD2DFactory->CreateEllipseGeometry(
            ellipse3,
            &m_pEllipseGeometry3
            );
    }

    if (SUCCEEDED(hr))
    {
        const D2D1_ELLIPSE ellipse4 = D2D1::Ellipse(
            D2D1::Point2F(105.0f, 105.0f),
            100.0f,
            100.0f
            );

        hr = m_pD2DFactory->CreateEllipseGeometry(
            ellipse4,
            &m_pEllipseGeometry4
            );
    }

    if (SUCCEEDED(hr))
    {
        ID2D1Geometry *ppGeometries[] =
        {
            m_pEllipseGeometry1,
            m_pEllipseGeometry2,
            m_pEllipseGeometry3,
            m_pEllipseGeometry4
        };

        hr = m_pD2DFactory->CreateGeometryGroup(
            D2D1_FILL_MODE_ALTERNATE,
            ppGeometries,
            ARRAYSIZE(ppGeometries),
            &m_pGeoGroup_AlternateFill
            );

        if (SUCCEEDED(hr))
        {
            hr = m_pD2DFactory->CreateGeometryGroup(
                D2D1_FILL_MODE_WINDING,
                ppGeometries,
                ARRAYSIZE(ppGeometries),
                &m_pGeoGroup_WindingFill
                );
        }

    }
    return hr;
}

規格需求

   
最低支援的用戶端 適用于 Windows Vista 的 Windows 7、Windows Vista SP2 和平臺更新 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2008 R2、Windows Server 2008 SP2 和 Platform Update for Windows Server 2008 [傳統型應用程式 |UWP 應用程式]
標頭 d2d1.h

另請參閱

幾何概觀

ID2D1Factory::CreateGeometryGroup