我想使用此函数获取轮廓,并在这些轮廓内获取三次贝塞尔曲线。我想我必须用GGO_BEZIER来称呼它。让我感到困惑的是返回缓冲区的工作方式。


  “字形轮廓作为
  一系列定义的一个或多个轮廓
  通过TTPOLYGONHEADER结构
  然后是一条或多条曲线。每
  轮廓中的曲线由
  TTPOLYCURVE结构,后跟一个
  POINTFX数据点数。 POINTFX
  点是绝对位置,不是
  相对动作。起点
  轮廓由pfxStart给出
  TTPOLYGONHEADER的成员
  结构体。每个起点
  曲线是终点
  上一条曲线或起点
  轮廓数据计数
  曲线中的点存储在
  TTPOLYCURVE结构的cpfx成员。
  每个轮廓的大小
  缓冲区(以字节为单位)存储在cb中
  TTPOLYGONHEADER结构的成员。
  其他曲线定义是
  打包到以下缓冲区
  前面的曲线和其他
  轮廓打包到缓冲区中
  遵循前面的轮廓。的
  缓冲区包含的轮廓与
  适合由返回的缓冲区
  GetGlyphOutline。”


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

谢谢

最佳答案

我自己从未使用过此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。

请原谅任何潜在的错误,因为我自己并未对此进行测试:)

08-07 02:38