Compartilhar via


D2D1_FILL_MODE enumeração (d2d1.h)

Especifica como as áreas de interseção de geometrias ou figuras são combinadas para formar a área da geometria composta.

Syntax

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

Constantes

 
D2D1_FILL_MODE_ALTERNATE
Valor: 0
Determina se um ponto está na região de preenchimento desenhando um raio desse ponto para infinito em qualquer direção e, em seguida, contando o número de segmentos de caminho dentro da forma especificada que o raio cruza. Se esse número for ímpar, o ponto estará na região de preenchimento; se, mesmo, o ponto estiver fora da região de preenchimento.
D2D1_FILL_MODE_WINDING
Valor: 1
Determina se um ponto está na região de preenchimento do caminho desenhando um raio desse ponto para infinito em qualquer direção e examinando os locais onde um segmento da forma cruza o raio. Começando com uma contagem de zero, adicione uma cada vez que um segmento cruza o raio da esquerda para a direita e subtraia um cada vez que um segmento de caminho cruza o raio da direita para a esquerda, desde que a esquerda e a direita sejam vistas da perspectiva do raio. Depois de contar as travessias, se o resultado for zero, o ponto estará fora do caminho. Caso contrário, ele estará dentro do caminho.
D2D1_FILL_MODE_FORCE_DWORD
Valor: 0xffffffff

Comentários

Use a enumeração D2D1_FILL_MODE ao criar um ID2D1GeometryGroup com o método CreateGeometryGroup ou ao modificar o modo de preenchimento de um método ID2D1SimplifiedGeometrySink com o método ID2D1SimplifiedGeometrySink::SetFillMode .

O Direct2D preenche o interior de um caminho usando um dos dois modos de preenchimento especificados por essa enumeração: D2D1_FILL_MODE_ALTERNATE (alternativo) ou D2D1_FILL_MODE_WINDING (enrolamento). Como os modos determinam como preencher o interior de uma forma fechada, todas as formas são tratadas como fechadas quando são preenchidas. Se houver uma lacuna em um segmento em uma forma, desenhe uma linha imaginária para fechá-la.

Para ver a diferença entre os modos de enrolamento e preenchimento alternativo, suponha que você tenha quatro círculos com o mesmo centro e um raio diferente, conforme mostrado na ilustração a seguir. O primeiro tem o raio de 25, o segundo 50, o terceiro 75 e o quarto 100.

Ilustração de quatro círculos concêntricos com valores de raio diferentes A ilustração a seguir mostra a forma preenchida usando o modo de preenchimento alternativo. Observe que o centro e o terceiro anel não estão preenchidos. Isso ocorre porque um raio desenhado de qualquer ponto em qualquer um desses dois anéis passa por um número par de segmentos. Ilustração de círculos concêntricos com o segundo e o quarto anéis preenchidos A ilustração a seguir explica esse processo. Ilustração de círculos concêntricos com pontos no segundo e terceiro anéis e dois raios arbitrários se estendendo de cada ponto A ilustração a seguir mostra como a mesma forma é preenchida quando o modo de preenchimento sinuoso é especificado. Ilustração de círculos concêntricos com todos os anéis preenchidos Observe que todos os anéis estão preenchidos. Isso ocorre porque todos os segmentos são executados na mesma direção, portanto, um raio desenhado de qualquer ponto cruzará um ou mais segmentos e a soma das travessias não será igual a zero.

A ilustração a seguir explica esse processo. As setas vermelhas representam a direção na qual os segmentos são desenhados e a seta preta representa um raio arbitrário que é executado de um ponto no anel mais interno. Começando com um valor zero, para cada segmento que o raio cruza, um valor de um é adicionado para cada interseção no sentido horário. Todos os pontos estão na região de preenchimento nesta ilustração, porque a contagem não é igual a zero.

Ilustração de círculos concêntricos com um raio de dentro do primeiro anel que cruza todos os quatro anéis

Exemplos

O exemplo de código a seguir cria os grupos de geometria que usaram as ilustrações anteriores. O código primeiro declara uma matriz de objetos geometry. Esses objetos são quatro círculos concêntricos que têm os seguintes raios: 25, 50, 75 e 100. Em seguida, chame CreateGeometryGroup no objeto ID2D1Factory , passando D2D1_FILL_MODE_ALTERNATE, uma matriz de objetos geometry a serem adicionados ao grupo geometry e o número de elementos nessa matriz.

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;
}

Requisitos

   
Cliente mínimo com suporte Windows 7, Windows Vista com SP2 e Atualização de Plataforma para Windows Vista [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2008 R2, Windows Server 2008 com SP2 e Platform Update para Windows Server 2008 [aplicativos da área de trabalho | Aplicativos UWP]
Cabeçalho d2d1.h

Confira também

Visão geral de geometrias

ID2D1Factory::CreateGeometryGroup