vpoint.clear();
int aaa=m_editfont.GetLength();
GLYPHMETRICS gm;
DWORD dwSize;
HANDLE hMem;
LPTTPOLYGONHEADER lpph;
LPBYTE lpb;
long cbOutline, cbTotal;
HWND hwnd1;
CRect rect1;
GetDlgItem(PICTURE1,&hwnd1);
::GetWindowRect(hwnd1,&rect1);
ScreenToClient (&rect1);
HDC hdc=::GetDC(hwnd1);
CDC dc1;
dc1.Attach(hdc);
m_font1.CreateFontIndirect(&m_type.Info);
dc1.SelectObject(&m_font1);
MAT2 m2;
m2.eM11 = FloatToFixed(1.0);
m2.eM12 = FloatToFixed(0.0);
m2.eM21 = FloatToFixed(0.0);
m2.eM22 = FloatToFixed(1.0);
for(int i=0;i<m_editfont.GetLength();i++)
{
UINT uchar;//判斷是漢字還是字元
if (m_editfont.GetAt(i) >= 0)
uchar = m_editfont.GetAt(i);
else
{
int th = m_editfont.GetAt(i);
int tl = m_editfont.GetAt(i+1);
uchar = ((th & 0x00ff)<<8) + (tl & 0x00ff);
i++;
}
dwSize = dc1.GetGlyphOutline(uchar,GGO_NATIVE,&gm,0L,NULL,&m2); //獲得外輪廓資訊
hMem=GlobalAlloc(GHND,dwSize);//分配記憶體
lpph=(LPTTPOLYGONHEADER)GlobalLock(hMem);//獲得記憶體控制代碼
dc1.GetGlyphOutline(uchar,GGO_NATIVE,&gm,dwSize,lpph,&m2); //獲得外輪廓資訊
cbTotal = dwSize;//獲得折點所佔緩衝區的大小
CPoint p1;
p1.x=-1;
p1.y=-1;
vpoint.push_back(p1);
while( cbTotal > 0 )//有多個
{
HWND hwnd1;
GetDlgItem(PICTURE1,&hwnd1);
HDC hdc=::GetDC(hwnd1);
CDC dc1;
dc1.Attach(hdc);
int xOld = mapFXY( lpph->pfxStart.x );//座標轉化
int yOld = mapFXY( lpph->pfxStart.y );//座標轉化
p1.x=xOld;
p1.y=200-10-yOld;
dc1.MoveTo(xOld,200-10-yOld);
vpoint.push_back(p1);
lpb = (LPBYTE)lpph + sizeof(TTPOLYGONHEADER);//TTPOLYGONHEADER為truetype字型檔頭結構
//lpb指向弧線描述的首地址
cbOutline = (long)lpph->cb - sizeof(TTPOLYGONHEADER);//獲得所有
while( cbOutline > 0 )
{
int n;
LPTTPOLYCURVE lpc;
lpc = (LPTTPOLYCURVE)lpb;
//LPTTPOLYCURVE定義了字型的一個弧度,其中包括 是否直線 二次b樣條 3次b樣條
//以及描述點的個數
/*
此結構表示truetype字型外輪廓線的一條曲線
typedef struct tagTTPOLYCURVE { // ttpc
WORD wType; //曲線類型
WORD cpfx; //折點數目
POINTFX apfx[1]; //折點數組
} TTPOLYCURVE, FAR* LPTTPOLYCURVE;
*/
drawOutLine(&dc1,lpc->wType,lpc->cpfx,lpc->apfx, 0, 0);//畫曲線
int count=lpc->cpfx;//獲得點結構的個數
for (int i=0;i<count;i++)
{
p1.x=mapFXY(lpc->apfx[i].x);
p1.y=mapFXY(lpc->apfx[i].y);
//point.push_back(p1);
}
n = sizeof(TTPOLYCURVE) + sizeof(POINTFX) * (lpc->cpfx - 1);
//n是每個線條點所佔的地區大小
lpb += n;//曲線組下移
cbOutline -= n;
}
dc1.LineTo(xOld,200-yOld-10);//畫結束線
p1.x=xOld;
p1.y=200-10-yOld;
vpoint.push_back(p1);
p1.x=-1;
p1.y=-1;
vpoint.push_back(p1);
cbTotal -= lpph->cb;//檔案下移
lpph = (LPTTPOLYGONHEADER)lpb;
}
}