2010-06-10 136 views
0

我想要使用此函數來獲取輪廓,並在這些輪廓中,我想得到立方貝塞爾。我想我必須用GGO_BEZIER來稱呼它。令我感到困惑的是返回緩衝區如何工作。幫助GetGlyphOutline函數(WinAPI)

「A字形輪廓被返回作爲 一系列的一個或多個輪廓的通過隨後的一個或多個曲線的TTPOLYGONHEADER結構 定義 。在輪廓的每個 曲線由 TTPOLYCURVE結構隨後定義一個 數目的POINTFX數據點。POINTFX 點是絕對位置,而不是相對於 移動。的 起點的輪廓由TTPOLYGONHEADER 結構的pfxStart 構件給出。每 曲線的起始點是輪廓的前一個曲線的 的最後一個點或起始點 。曲線中的點數的計數存儲在TTPOLYCURVE結構的cpfx成員 中。 緩衝區中的每個輪廓的大小(以字節爲單位)存儲在TTPOLYGONHEADER結構的成員cb 中。 附加的曲線定義是 包裝在 前面的曲線之後的緩衝器中,並且附加的 輪廓被打包到前面的輪廓之後的緩衝器 中。作爲 適合緩衝區內 GetGlyphOutline返回的 緩衝區包含儘可能多的輪廓。」

我真的不知道如何訪問輪廓。我知道我可以改變一個指向另一類型的指針,但我不知道我該怎麼去獲得基於這個文檔的輪廓

感謝

回答

1

我從來沒有使用這個API自己,但閱讀的MSDN文檔後,我想應該是這樣的:。

首先您必須撥打​​並將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->cpfx成員。 然後你就可以做這樣的事情遍歷所有的點:

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

由於TTPOLYGONHEADER不告訴你TTPOLYCURVE結構有多少是在緩衝區中,我想你必須保持的該跟蹤自己從你的緩衝區大小減去各個結構的大小,並保持下去,直到你到達0

請原諒任何潛在的錯誤,我沒有測試此我自己:)

+0

謝謝,夥計在做微軟事情複雜化! – jmasterx 2010-06-10 13:12:53