Почему эта группа геометрии Direct2D не заполняется - PullRequest
0 голосов
/ 05 июня 2018

Вот один сложный способ нарисовать прямоугольник.Однако это взято из более сложного примера, где прямоугольные углы имеют разную геометрию.Я пытаюсь понять этот принцип, потому что я явно что-то упускаю.

А именно, когда я рисую группу геометрии, возвращенную из функции, приведенной ниже, я делаю , получаю нарисованный прямоугольник.Когда я пытаюсь заполнить группу геометрии, не заполняется .Вопрос в том, почему.

Я играл с различными параметрами для геометрии пути для каждой линии, но, похоже, ничего не работает.Согласно документации, единственное, что должно иметь значение, - это правильная ориентация геометрий, добавленных в группу геометрии, и я считаю, что все линии правильно ориентированы и идут по часовой стрелке.

Вот код:

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