enumeración D2D1_FILL_MODE (d2d1.h)
Especifica cómo se combinan las áreas de intersección de geometrías o figuras para formar el área de la geometría compuesta.
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 si un punto está en la región de relleno dibujando un rayo desde ese punto hasta el infinito en cualquier dirección y, a continuación, contando el número de segmentos de ruta dentro de la forma especificada que cruza el rayo. Si este número es impar, el punto está en la región de relleno; si incluso, el punto está fuera de la región de relleno. |
D2D1_FILL_MODE_WINDING Valor: 1 Determina si un punto está en la región de relleno del trazado dibujando un rayo desde ese punto hasta el infinito en cualquier dirección y examinando los lugares donde un segmento de la forma cruza el rayo. A partir de un recuento de cero, agrega uno cada vez que un segmento cruza el rayo de izquierda a derecha y resta uno cada vez que un segmento de ruta cruza el rayo de derecha a izquierda, siempre y cuando se vean a la izquierda y a la derecha desde la perspectiva del rayo. Después de contar los cruces, si el resultado es cero, el punto está fuera de la ruta de acceso. De lo contrario, está dentro de la ruta de acceso. |
D2D1_FILL_MODE_FORCE_DWORD Valor: 0xffffffff |
Comentarios
Use la enumeración D2D1_FILL_MODE al crear un ID2D1GeometryGroup con el método CreateGeometryGroup o al modificar el modo de relleno de un ID2D1SimplifiedGeometrySink con el método ID2D1SimplifiedGeometrySink::SetFillMode .
Direct2D rellena el interior de una ruta de acceso mediante uno de los dos modos de relleno especificados por esta enumeración: D2D1_FILL_MODE_ALTERNATE (alternativo) o D2D1_FILL_MODE_WINDING (desenlazamiento). Dado que los modos determinan cómo rellenar el interior de una forma cerrada, todas las formas se tratan como cerradas cuando se rellenan. Si hay un hueco en un segmento en una forma, dibuje una línea imaginaria para cerrarla.
Para ver la diferencia entre los modos de revanado y relleno alternativo, suponga que tiene cuatro círculos con el mismo centro y un radio diferente, como se muestra en la ilustración siguiente. El primero tiene el radio de 25, el segundo 50, el tercero 75 y el cuarto 100.
En la ilustración siguiente se muestra la forma rellenada mediante el modo de relleno alternativo. Observe que el centro y el tercer anillo no están llenos. Esto se debe a que un rayo extraído de cualquier punto en cualquiera de esos dos anillos pasa a través de un número par de segmentos. En la ilustración siguiente se explica este proceso. En la ilustración siguiente se muestra cómo se rellena la misma forma cuando se especifica el modo de relleno de revanado. Observe que todos los anillos se rellenan. Esto se debe a que todos los segmentos se ejecutan en la misma dirección, por lo que un rayo dibujado desde cualquier punto cruzará uno o varios segmentos, y la suma de los cruces no será igual a cero.En la ilustración siguiente se explica este proceso. Las flechas rojas representan la dirección en la que se dibujan los segmentos y la flecha negra representa un rayo arbitrario que se ejecuta desde un punto en el anillo más interior. A partir de un valor de cero, para cada segmento que cruza el rayo, se agrega un valor de uno para cada intersección en el sentido de las agujas del reloj. Todos los puntos se encuentran en la región de relleno de esta ilustración, porque el recuento no es igual a cero.
Ejemplos
En el ejemplo de código siguiente se crean los grupos de geometría que se usan en las ilustraciones anteriores. El código declara primero una matriz de objetos geometry. Estos objetos son cuatro círculos concéntricos que tienen los siguientes radios: 25, 50, 75 y 100. A continuación, llame a CreateGeometryGroup en el objeto ID2D1Factory , pasando D2D1_FILL_MODE_ALTERNATE, una matriz de objetos geometry para agregar al grupo de geometría y el número de elementos de esta 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 compatible | Windows 7, Windows Vista con SP2 y Platform Update para Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2008 R2, Windows Server 2008 con SP2 y Actualización de plataforma para Windows Server 2008 [aplicaciones de escritorio | Aplicaciones para UWP] |
Encabezado | d2d1.h |