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;
}
}