Partager via


énumération D2D1_FILL_MODE (d2d1.h)

Spécifie la façon dont les zones d’intersection des géométries ou des figures sont combinées pour former la zone de la géométrie composite.

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
Valeur : 0
Détermine si un point se trouve dans la région de remplissage en dessinant un rayon de ce point vers l’infini dans n’importe quelle direction, puis en comptant le nombre de segments de chemin dans la forme donnée que le rayon traverse. Si ce nombre est impair, le point se trouve dans la région de remplissage ; si même, le point se trouve en dehors de la région de remplissage.
D2D1_FILL_MODE_WINDING
Valeur : 1
Détermine si un point se trouve dans la zone de remplissage du chemin en dessinant un rayon de ce point vers l’infini dans n’importe quelle direction, puis en examinant les endroits où un segment de la forme traverse le rayon. En commençant par un nombre de zéro, ajoutez un chaque fois qu’un segment traverse le rayon de gauche à droite et soustrayez un chaque fois qu’un segment de chemin traverse le rayon de droite à gauche, tant que gauche et droite sont vus du point de vue du rayon. Après avoir compté les croisements, si le résultat est égal à zéro, le point se trouve en dehors du chemin d’accès. Sinon, il est à l’intérieur du chemin.
D2D1_FILL_MODE_FORCE_DWORD
Valeur : 0xffffffff

Notes

Utilisez l’énumération D2D1_FILL_MODE lors de la création d’un ID2D1GeometryGroup avec la méthode CreateGeometryGroup ou lors de la modification du mode de remplissage d’un ID2D1SimplifiedGeometrySink avec la méthode ID2D1SimplifiedGeometrySink::SetFillMode .

Direct2D remplit l’intérieur d’un chemin à l’aide de l’un des deux modes de remplissage spécifiés par cette énumération : D2D1_FILL_MODE_ALTERNATE (alternative) ou D2D1_FILL_MODE_WINDING (enroulement). Étant donné que les modes déterminent comment remplir l’intérieur d’une forme fermée, toutes les formes sont traitées comme fermées lorsqu’elles sont remplies. S’il y a un écart dans un segment d’une forme, tracez une ligne imaginaire pour le fermer.

Pour voir la différence entre les modes d’enroulement et de remplissage alternatif, supposons que vous avez quatre cercles avec le même centre et un rayon différent, comme illustré dans l’illustration suivante. Le premier a le rayon de 25, le second 50, le troisième 75 et le quatrième 100.

Illustration de quatre cercles concentriques avec des valeurs de rayon différentes L’illustration suivante montre la forme remplie à l’aide du mode de remplissage de remplacement. Notez que le centre et le troisième anneau ne sont pas remplis. Cela est dû au fait qu’un rayon tiré d’un point quelconque de l’un de ces deux anneaux passe à travers un nombre pair de segments. Illustration de cercles concentriques avec les deuxième et quatrième anneaux remplis L’illustration suivante explique ce processus. Illustration de cercles concentriques avec des points dans les deuxième et troisième anneaux et deux rayons arbitraires s’étendant de chaque point L’illustration suivante montre comment la même forme est remplie lorsque le mode de remplissage enroulement est spécifié. Illustration de cercles concentriques avec tous les anneaux remplis Notez que tous les anneaux sont remplis. Cela est dû au fait que tous les segments s’exécutent dans la même direction. Par conséquent, un rayon tiré d’un point quelconque traverse un ou plusieurs segments, et la somme des croisements n’est pas égale à zéro.

L’illustration suivante explique ce processus. Les flèches rouges représentent la direction dans laquelle les segments sont dessinés et la flèche noire représente un rayon arbitraire qui s’exécute à partir d’un point dans l’anneau le plus profond. À compter de zéro, pour chaque segment traversé par le rayon, une valeur de un est ajoutée pour chaque intersection dans le sens des aiguilles d’une montre. Tous les points se trouvent dans la zone de remplissage de cette illustration, car le nombre n’est pas égal à zéro.

Illustration de cercles concentriques avec un rayon de l’intérieur du premier anneau qui traverse les quatre anneaux

Exemples

L’exemple de code suivant crée les groupes geometry utilisés dans les illustrations précédentes. Le code déclare d’abord un tableau d’objets geometry. Ces objets sont quatre cercles concentriques qui ont les rayons suivants : 25, 50, 75 et 100. Appelez ensuite CreateGeometryGroup sur l’objet ID2D1Factory , en passant D2D1_FILL_MODE_ALTERNATE, un tableau d’objets geometry à ajouter au groupe geometry et le nombre d’éléments dans ce tableau.

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

Spécifications

   
Client minimal pris en charge Windows 7, Windows Vista avec SP2 et Mise à jour de plateforme pour Windows Vista [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2008 R2, Windows Server 2008 avec SP2 et Mise à jour de plateforme pour Windows Server 2008 [applications de bureau | Applications UWP]
En-tête d2d1.h

Voir aussi

Vue d’ensemble des géométries

ID2D1Factory::CreateGeometryGroup