Вот один сложный способ нарисовать прямоугольник.Однако это взято из более сложного примера, где прямоугольные углы имеют разную геометрию.Я пытаюсь понять этот принцип, потому что я явно что-то упускаю.
А именно, когда я рисую группу геометрии, возвращенную из функции, приведенной ниже, я делаю , получаю нарисованный прямоугольник.Когда я пытаюсь заполнить группу геометрии, не заполняется .Вопрос в том, почему.
Я играл с различными параметрами для геометрии пути для каждой линии, но, похоже, ничего не работает.Согласно документации, единственное, что должно иметь значение, - это правильная ориентация геометрий, добавленных в группу геометрии, и я считаю, что все линии правильно ориентированы и идут по часовой стрелке.
Вот код:
CComPtr<ID2D1GeometryGroup> Test(ID2D1Factory* factory, RECT& r)
{
CComPtr<ID2D1PathGeometry> tLine;
CComPtr<ID2D1PathGeometry> rLine;
CComPtr<ID2D1PathGeometry> bLine;
CComPtr<ID2D1PathGeometry> lLine;
//top horizontal line geometry
{
auto hr = factory->CreatePathGeometry(&tLine);
CComPtr<ID2D1GeometrySink> sink;
hr = tLine->Open(&sink);
sink->SetFillMode(D2D1_FILL_MODE_WINDING);
sink->BeginFigure(
D2D1::Point2F(r.left, r.top),
D2D1_FIGURE_BEGIN_HOLLOW
);
sink->AddLine(D2D1::Point2F(r.right, r.top));
sink->EndFigure(D2D1_FIGURE_END_OPEN);
sink->Close();
}
//right vertical line geometry
{
auto hr = factory->CreatePathGeometry(&rLine);
CComPtr<ID2D1GeometrySink> sink;
hr = rLine->Open(&sink);
sink->SetFillMode(D2D1_FILL_MODE_WINDING);
sink->BeginFigure(
D2D1::Point2F(r.right, r.top),
D2D1_FIGURE_BEGIN_HOLLOW
);
sink->AddLine(D2D1::Point2F(r.right, r.bottom));
sink->EndFigure(D2D1_FIGURE_END_OPEN);
sink->Close();
}
//bottom horizontal line geometry
{
auto hr = factory->CreatePathGeometry(&bLine);
CComPtr<ID2D1GeometrySink> sink;
hr = bLine->Open(&sink);
sink->SetFillMode(D2D1_FILL_MODE_WINDING);
sink->BeginFigure(
D2D1::Point2F(r.right, r.bottom),
D2D1_FIGURE_BEGIN_HOLLOW
);
sink->AddLine(D2D1::Point2F(r.left, r.bottom));
sink->EndFigure(D2D1_FIGURE_END_OPEN);
sink->Close();
}
//left vertical line geometry
{
auto hr = factory->CreatePathGeometry(&lLine);
CComPtr<ID2D1GeometrySink> sink;
hr = lLine->Open(&sink);
sink->SetFillMode(D2D1_FILL_MODE_WINDING);
sink->BeginFigure(
D2D1::Point2F(r.left, r.bottom),
D2D1_FIGURE_BEGIN_HOLLOW
);
sink->AddLine(D2D1::Point2F(r.left, r.top));
sink->EndFigure(D2D1_FIGURE_END_OPEN);
sink->Close();
}
ID2D1Geometry *ppGeometries[] =
{
tLine,
rLine,
bLine,
lLine
};
CComPtr<ID2D1GeometryGroup> group;
auto hr = factory->CreateGeometryGroup(
D2D1_FILL_MODE_WINDING,
ppGeometries,
4,
&group);
return group;
}