【问题标题】:Help with GetGlyphOutline function(WinAPI)GetGlyphOutline 函数帮助(WinAPI)
【发布时间】:2010-06-10 18:00:29
【问题描述】:

我想用这个函数来获得轮廓,在这些轮廓中,我想获得三次贝塞尔曲线。我想我必须用 GGO_BEZIER 来调用它。令我困惑的是返回缓冲区是如何工作的。

"字形轮廓返回为 一系列定义的一个或多个轮廓 通过 TTPOLYGONHHEDER 结构 后跟一条或多条曲线。每个 轮廓中的曲线由 a 定义 TTPOLYCURVE 结构后跟一个 POINTFX 数据点的数量。 POINTFX 点是绝对位置,而不是 相对移动。的出发点 轮廓由 pfxStart 给出 TTPOLYGONHEADER 成员 结构体。每个人的起点 曲线是最后一个点 上一条曲线或起点 的轮廓。数据的计数 曲线中的点存储在 TTPOLYCURVE 结构的 cpfx 成员。 每个轮廓的大小 缓冲区,以字节为单位,存储在 cb 中 TTPOLYGONHEADER 结构的成员。 附加曲线定义是 打包到缓冲区以下 前面的曲线和附加 轮廓被打包到缓冲区中 跟随前面的轮廓。这 缓冲区包含与 适合由返回的缓冲区 获取 GlyphOutline。”

我真的不确定如何访问轮廓。我知道我可以将指针更改为另一种类型的指针,但我不确定如何根据此文档获取轮廓。

谢谢

【问题讨论】:

    标签: c++ c winapi


    【解决方案1】:

    我自己从未使用过这个 API,但是在阅读了 MSDN 文档后,我认为它的工作原理是这样的:

    首先您必须调用GetGlyphOutline,并将lpvBuffer 参数设置为NULL。然后该函数将返回所需的缓冲区大小。然后,您必须分配具有该大小的缓冲区,然后再次调用该函数,并将 lpvBuffer 设置为新创建的缓冲区。
    如果您查看TTPOLYGONHEADER 的文档,它会说:

    每个 TTPOLYGONHEADER 结构后跟一个或多个 TTPOLYCURVE 结构。

    所以,基本上你必须这样做:

    BYTE*              pMyBuffer   = NULL;
    ...
    TTPOLYGONHEADER*    pPolyHdr    = reinterpret_cast<TTPOLYGONHEADER*>(pMyBuffer);
    TTPOLYCURVE*        pPolyCurve  = reinterpret_cast<TTPOLYCURVE*>(pMyBuffer + sizeof(TTPOLYGONHEADER));
    

    然后,检查包含POINTFX 结构数量的pPolyCurve-&gt;cpfx 成员。 然后您可以通过执行以下操作来迭代所有点:

    for (WORD i = 0; i < pPolyCurve->cpfx: ++i)
    {
        pCurve->apfx[i].x;
        pCurve->apfx[i].y;
    }
    

    由于TTPOLYGONHEADER 没有告诉您缓冲区中有多少TTPOLYCURVE 结构,我想您必须自己通过从缓冲区大小中减去各个结构的大小来跟踪这一点并继续前进,直到达到 0。

    请原谅任何潜在的错误,因为我没有自己测试这个:)

    【讨论】:

    • 谢谢,微软把事情复杂化了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多