D2D1_FILL_MODE-Enumeration (d2d1.h)
Gibt an, wie die sich überschneidenden Bereiche von Geometrien oder Figuren kombiniert werden, um den Bereich der zusammengesetzten Geometrie zu bilden.
Syntax
typedef enum D2D1_FILL_MODE {
D2D1_FILL_MODE_ALTERNATE = 0,
D2D1_FILL_MODE_WINDING = 1,
D2D1_FILL_MODE_FORCE_DWORD = 0xffffffff
} ;
Konstanten
D2D1_FILL_MODE_ALTERNATE Wert: 0 Bestimmt, ob sich ein Punkt im Füllbereich befindet, indem ein Strahl von diesem Punkt bis zur Unendlichkeit in eine beliebige Richtung gezeichnet wird, und dann die Anzahl der Pfadsegmente innerhalb der angegebenen Form zählt, die der Strahl kreuzt. Wenn diese Zahl ungerade ist, befindet sich der Punkt im Füllbereich; wenn gerade, befindet sich der Punkt außerhalb des Füllbereichs. |
D2D1_FILL_MODE_WINDING Wert: 1 Bestimmt, ob sich ein Punkt im Füllbereich des Pfads befindet, indem ein Strahl von diesem Punkt bis zur Unendlichkeit in eine beliebige Richtung gezeichnet wird, und dann die Stellen untersucht, an denen ein Segment der Form den Strahl kreuzt. Fügen Sie ab der Anzahl null jedes Mal einen hinzu, wenn ein Segment den Strahl von links nach rechts kreuzt, und subtrahieren Sie jedes Mal, wenn ein Pfadsegment den Strahl von rechts nach links kreuzt, solange links und rechts aus der Perspektive des Strahls gesehen werden. Nach dem Zählen der Kreuzungen befindet sich der Punkt außerhalb des Pfads, wenn das Ergebnis null ist. Andernfalls befindet es sich innerhalb des Pfads. |
D2D1_FILL_MODE_FORCE_DWORD Wert: 0xffffffff |
Hinweise
Verwenden Sie die D2D1_FILL_MODE-Enumeration beim Erstellen einer ID2D1GeometryGroup-Methode mit der CreateGeometryGroup-Methode oder beim Ändern des Füllmodus eines ID2D1SimplifiedGeometrySink mit der ID2D1SimplifiedGeometrySink::SetFillMode-Methode .
Direct2D füllt den Inneren eines Pfads aus, indem einer der beiden Füllmodi verwendet wird, die durch diese Enumeration angegeben werden: D2D1_FILL_MODE_ALTERNATE (alternativ) oder D2D1_FILL_MODE_WINDING (Wicklung). Da die Modi bestimmen, wie das Innere einer geschlossenen Form gefüllt werden soll, werden alle Formen beim Füllen als geschlossen behandelt. Wenn in einem Shape eine Lücke in einem Segment vorhanden ist, zeichnen Sie eine imaginäre Linie, um sie zu schließen.
Um den Unterschied zwischen dem Wickelmodus und dem alternativen Füllmodus zu sehen, gehen Sie davon aus, dass Sie über vier Kreise mit demselben Mittelpunkt und einem anderen Radius verfügen, wie in der folgenden Abbildung gezeigt. Die erste hat den Radius 25, der zweite 50, der dritte 75 und der vierte 100.
Die folgende Abbildung zeigt die Form, die im alternativen Füllmodus ausgefüllt wird. Beachten Sie, dass der mittlere und dritte Ring nicht gefüllt sind. Dies liegt daran, dass ein Strahl, der von einem beliebigen Punkt in einem dieser beiden Ringe gezeichnet wird, eine gerade Anzahl von Segmenten durchläuft. In der folgenden Abbildung wird dieser Vorgang erläutert. Die folgende Abbildung zeigt, wie dieselbe Form gefüllt wird, wenn der Wickelfüllmodus angegeben wird. Beachten Sie, dass alle Ringe gefüllt sind. Dies liegt daran, dass alle Segmente in derselben Richtung ausgeführt werden, sodass ein von einem beliebigen Punkt gezeichneter Strahl ein oder mehrere Segmente kreuzt und die Summe der Kreuzungen nicht gleich 0 ist.In der folgenden Abbildung wird dieser Vorgang erläutert. Die roten Pfeile stellen die Richtung dar, in der die Segmente gezeichnet werden, und der schwarze Pfeil stellt einen beliebigen Strahl dar, der von einem Punkt im innersten Ring aus läuft. Ab dem Wert null wird für jedes Segment, das der Strahl kreuzt, für jede Schnittmenge im Uhrzeigersinn ein Wert von 1 hinzugefügt. Alle Punkte befinden sich im Füllbereich in dieser Abbildung, da die Anzahl nicht gleich 0 ist.
Beispiele
Im folgenden Codebeispiel werden die Geometriegruppen erstellt, die in den vorherigen Abbildungen verwendet werden. Der Code deklariert zuerst ein Array von Geometrieobjekten. Diese Objekte sind vier konzentrische Kreise mit den folgenden Radien: 25, 50, 75 und 100. Rufen Sie dann createGeometryGroup für das ID2D1Factory-Objekt auf, und übergeben Sie D2D1_FILL_MODE_ALTERNATE, ein Array von Geometrieobjekten, die der Geometriegruppe hinzugefügt werden sollen, und die Anzahl der Elemente in diesem Array.
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;
}
Anforderungen
Unterstützte Mindestversion (Client) | Windows 7, Windows Vista mit SP2 und Plattformupdate für Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2008 R2, Windows Server 2008 mit SP2 und Plattformupdate für Windows Server 2008 [Desktop-Apps | UWP-Apps] |
Kopfzeile | d2d1.h |