GDI +创建填充的CustomLineCap

时间:2016-07-22 12:38:29

标签: c++ gdi+

我正在尝试在GDI +(C ++)中构建自定义行上限,而我无法用它来绘制填充上限,而未填充的上限可以正常。

我设置一个封闭的多边形路径,创建一个CustomLineCap,路径作为第一个参数(fillPath参数),并在笔上调用SetCustomStartCap:

std::vector<Gdiplus::Point> pathPoints =
    {
        Gdiplus::Point(20,0),
        Gdiplus::Point(0,20),
        Gdiplus::Point(-20,0),
        Gdiplus::Point(20,0)
    };

Gdiplus::GraphicsPath path;
path.AddPolygon(&pathPoints[0], 4);

Gdiplus::CustomLineCap startCap(&path, nullptr);
Gdiplus::CustomLineCap endCap(nullptr, path.Clone());

m_Pen.SetCustomStartCap(&startCap);
m_Pen.SetCustomEndCap(&endCap);

我已经阅读过评论,它可能与点顺序有关,或者路径是否已经完全关闭。我试过顺时针和逆时针都有点,但似乎没有帮助。

如果我做了明显错误的事情,或者我错过了什么,有人能发现吗?

1 个答案:

答案 0 :(得分:0)

除了点的顺序外,我认为还要求形状必须与负y轴相交,也就是直线本身。因此,如果您这样创建多边形

std::vector<Point> pathPoints =
{
    Gdiplus::Point(20,-1),
    Gdiplus::Point(0,19),
    Gdiplus::Point(-20,-1)
};

然后,您将获得具有所需形状和尺寸的线帽,但它会稍微重叠线。

或者,如果您想专门使用箭头,请查看AdjustableArrowCap。只需将isFilled属性设置为TRUE,就可以了。或者,您可以仅将Pen的SetStartCap / SetEndCap方法与LineCapArrowAnchor参数一起使用,但随后您可能无法自定义箭头。