如何使用 GDI+ 绘制带有填充颜色的(贝塞尔曲线)路径?

发布于 2024-08-06 04:12:35 字数 1193 浏览 5 评论 0原文

我正在使用 Windows API 和 GDI+ 为 Windows 制作 SVG 渲染器。 SVG 允许在路径上设置“填充”和“描边”样式属性。我在实现“填充”属性时遇到一些困难。

以下路径代表螺旋:

    <svg:path style="fill:yellow;stroke:blue;stroke-width:2"
              d="M153 334
                C153 334 151 334 151 334
                C151 339 153 344 156 344
                C164 344 171 339 171 334
                C171 322 164 314 156 314
                C142 314 131 322 131 334
                C131 350 142 364 156 364
                C175 364 191 350 191 334
                C191 311 175 294 156 294
                C131 294 111 311 111 334
                C111 361 131 384 156 384
                C186 384 211 361 211 334
                C211 300 186 274 156 274" />

填充颜色为黄色,它应该填充整个形状,但这就是我得到的:

在此处输入图像描述

我的 GDI+ 调用如下所示:

Gdiplus::GraphicsPath bezierPath;
bezierPath.AddBeziers(&gdiplusPoints[0], gdiplusPoints.size());
g.FillPath(&solidBrush, &bezierPath);
g.DrawPath(&pen, &bezierPath);

显然代码对于绘图是正确的形状,但不用于填充它。谁能帮我弄清楚出了什么问题吗?

I am making a SVG renderer for Windows using the Windows API and GDI+. SVG allows setting the 'fill' and 'stroke' style attributes on a Path. I am having some difficulty with the implementation of the 'fill' attribute.

The following path represents a spiral:

    <svg:path style="fill:yellow;stroke:blue;stroke-width:2"
              d="M153 334
                C153 334 151 334 151 334
                C151 339 153 344 156 344
                C164 344 171 339 171 334
                C171 322 164 314 156 314
                C142 314 131 322 131 334
                C131 350 142 364 156 364
                C175 364 191 350 191 334
                C191 311 175 294 156 294
                C131 294 111 311 111 334
                C111 361 131 384 156 384
                C186 384 211 361 211 334
                C211 300 186 274 156 274" />

The fill color is yellow, and it should fill the entire shape, this is however what I get:

enter image description here

My GDI+ calls look like this:

Gdiplus::GraphicsPath bezierPath;
bezierPath.AddBeziers(&gdiplusPoints[0], gdiplusPoints.size());
g.FillPath(&solidBrush, &bezierPath);
g.DrawPath(&pen, &bezierPath);

Apparently the code is correct for drawing the shape, but not for filling it. Can anyone help me in figuring out what's going wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

剩一世无双 2024-08-13 04:12:35

尝试将 GraphicsPath 的 FillMode 属性设置为 FillMode::Winding,这是一种适合您需要的替代填充方法。

Try to set the FillMode property of your GraphicsPath to FillMode::Winding, an alternate filling method that should suits your needs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文