D2D1_FILL_MODE 枚举 (d2d1.h)

指定如何组合几何图形或图形的相交区域以形成复合几何图形的区域。

语法

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::SetFillMode 方法修改 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 7、带 SP2 的 Windows Vista 和适用于 Windows Vista 的平台更新 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2008 R2、Windows Server 2008 SP2 和适用于 Windows Server 2008 的平台更新 [桌面应用 |UWP 应用]
标头 d2d1.h

另请参阅

几何概述

ID2D1Factory::CreateGeometryGroup