GDI+正在创建填充的CustomLineCap

GDI+ Creating filled CustomLineCap

本文关键字:CustomLineCap 填充 创建 GDI+      更新时间:2023-10-16

我正试图在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);

我读过一些评论,认为这可能与点顺序有关,或者如果路径肯定是封闭的。我试着把这些点同时按顺时针和逆时针排列,但似乎没有帮助。

有人能发现我是否做错了什么,或者我错过了什么吗?

除了点的顺序之外,我认为形状必须与负y轴相交,也就是线本身。所以,如果你创建这样的多边形

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

然后你会有一个想要的形状和大小的线帽,但它会与线重叠一点。

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