帮助GetGlyphOutline函数(WinAPI)

时间:2010-06-10 03:39:40

标签: c++ c winapi

我想使用此功能来获取轮廓,并且在这些轮廓内,我想得到立方贝塞尔曲线。我想我必须用GGO_BEZIER来称呼它。令我困惑的是返回缓冲区的工作原理。

  

“字形轮廓作为a返回   定义一个或多个轮廓的系列   通过TTPOLYGONHEADER结构   然后是一条或多条曲线。每   轮廓中的曲线由a定义   TTPOLYCURVE结构后跟一个   POINTFX数据点的数量。 POINTFX   积分是绝对的位置,而不是   相对动作。起点   轮廓由pfxStart给出   TTPOLYGONHEADER的成员   结构体。每个人的出发点   曲线是最后一点   前一曲线或起点   轮廓。数据的数量   曲线中的点存储在   cpfx是TTPOLYCURVE结构的成员。   每个轮廓的大小   缓冲区(以字节为单位)存储在cb中   TTPOLYGONHEADER结构的成员。   其他曲线定义是   打包到缓冲区后面   前面的曲线和附加   轮廓被打包到缓冲区中   按照前面的轮廓。该   缓冲区包含尽可能多的轮廓   适合返回的缓冲区   GetGlyphOutline“。

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

由于

1 个答案:

答案 0 :(得分: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));

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

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

由于TTPOLYGONHEADER没有告诉你缓冲区中有多少个TTPOLYCURVE结构,我想你必须通过从中减去单个结构的大小来跟踪它。缓冲区的大小,并一直持续到达0。

请原谅任何可能的错误,因为我自己没有测试过这种错误:)