перечисление 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 |
Комментарии
Используйте перечисление D2D1_FILL_MODE при создании ID2D1GeometryGroup с помощью метода CreateGeometryGroup или при изменении режима заполнения ID2D1SimplifiedGeometrySink с помощью метода ID2D1SimplifiedGeometrySink::SetFillMode .
Direct2D заполняет внутреннюю часть пути, используя один из двух режимов заполнения, заданных этим перечислением: D2D1_FILL_MODE_ALTERNATE (альтернативный) или D2D1_FILL_MODE_WINDING (обмотка). Так как режимы определяют способ заполнения внутренней части закрытой фигуры, все фигуры обрабатываются как закрытые при заполнении. Если в сегменте фигуры есть разрыв, нарисуйте воображаемую линию, чтобы закрыть ее.
Чтобы увидеть разницу между обмоткой и альтернативным режимами заливки, предположим, что у вас есть четыре круга с тем же центром и разными радиусами, как показано на следующем рисунке. Первый имеет радиус 25, второй 50, третий 75 и четвертый 100.
![Иллюстрация четырех концентрических кругов с разными значениями радиуса](images/fillmode_not_filled_01.png)
![Иллюстрация концентрических кругов со вторым и четвертым кольцами](images/fillmode_01.png)
![Иллюстрация концентрических кругов с точками во втором и третьем кольцах и двумя произвольными лучами, простирающимися от каждой точки](images/fillmode_03.png)
![Иллюстрация концентрических кругов со всеми заполненными кольцами](images/fillmode_02.png)
Этот процесс описан на следующем рисунке. Красные стрелки представляют направление, в котором отрисовываются сегменты, а черная стрелка представляет произвольный луч, который проходит от точки во внутреннем кольце. Начиная со значения 0 для каждого сегмента, пересекаемого лучом, для каждого пересечения по часовой стрелке добавляется значение 1. Все точки находятся в области заполнения на этом рисунке, так как счетчик не равен нулю.
![Иллюстрация концентрических кругов с лучом из первого кольца, который пересекает все четыре кольца](images/fillmode_04.png)
Примеры
В следующем примере кода создаются геометрические группы, используемые на предыдущих иллюстрациях. Код сначала объявляет массив объектов geometry. Эти объекты представляют собой четыре концентрических круга со следующими радиусами: 25, 50, 75 и 100. Затем вызовите CreateGeometryGroup для объекта ID2D1Factory , передав 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, Windows Vista с пакетом обновления 2 (SP2) и обновление платформы для Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 R2, Windows Server 2008 с пакетом обновления 2 (SP2) и Обновление платформы для Windows Server 2008 [классические приложения | Приложения UWP] |
Верхняя часть | d2d1.h |