通過(guò)提取楷體的字形輪廓可以獲得漢字筆畫。只不過(guò)選用的字體必須是楷體。其他字體不行。
這功能沒(méi)什么用途吧,我只是好玩而已。
int GetCharStrokes(UINT ch)
{
HFONT hFont;
{ // create font;
LOGFONT lfFont;
memset(&lfFont, 0, sizeof(lfFont));
lstrcpy(lfFont.lfFaceName, "楷體_GB2312");
lfFont.lfHeight = 72;
lfFont.lfWeight = FW_NORMAL;
lfFont.lfItalic = FALSE;
lfFont.lfStrikeOut = FALSE;
lfFont.lfCharSet = DEFAULT_CHARSET;
lfFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
lfFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lfFont.lfQuality = DRAFT_QUALITY;
lfFont.lfPitchAndFamily = DEFAULT_PITCH;
hFont = CreateFontIndirect(&lfFont);
}
HDC hDC = GetDC(NULL);
if (hDC==NULL) return 0;
HGDIOBJ hOldFont = SelectObject(hDC,hFont);
MAT2 mat;
memset(&mat,0,sizeof(mat));
mat.eM11.value = 1;
mat.eM22.value = -1;
GLYPHMETRICS gm;
memset(&gm,0,sizeof(gm));
DWORD dwSize = GetGlyphOutline(hDC,ch,GGO_NATIVE,&gm,0,NULL,&mat);
int cnt = 0;
LPVOID pBuff = NULL;
if (dwSize>0)
{
pBuff = malloc(dwSize);
memset(&gm,0,sizeof(gm));
DWORD res = GetGlyphOutline(hDC,ch,GGO_NATIVE,&gm,dwSize,pBuff,&mat);
if (res!=dwSize)
{
free(pBuff);
pBuff = NULL;
}
}
if (pBuff)
{
BYTE * ptr = (BYTE *)pBuff;
while (dwSize>0)
{
TTPOLYGONHEADER * header = (TTPOLYGONHEADER *)ptr;
cnt ++;
ptr += header->cb;
dwSize -= header->cb;
}
free(pBuff);
}
SelectObject(hDC,hOldFont);
ReleaseDC(NULL,hDC);
return cnt;
}
測(cè)試:
union {
UINT ch;
char szText[4];
} a;
char * szText = "疆";
a.ch = 0;
a.szText[1] = szText[0];
a.szText[0] = szText[1];
int cnt = GetCharStrokes(a.ch);
TRACE("\"%s\"的筆畫%d\n",szText,cnt);
運(yùn)行結(jié)果:
"疆"的筆畫19
這功能沒(méi)什么用途吧,我只是好玩而已。
int GetCharStrokes(UINT ch)
{
HFONT hFont;
{ // create font;
LOGFONT lfFont;
memset(&lfFont, 0, sizeof(lfFont));
lstrcpy(lfFont.lfFaceName, "楷體_GB2312");
lfFont.lfHeight = 72;
lfFont.lfWeight = FW_NORMAL;
lfFont.lfItalic = FALSE;
lfFont.lfStrikeOut = FALSE;
lfFont.lfCharSet = DEFAULT_CHARSET;
lfFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
lfFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lfFont.lfQuality = DRAFT_QUALITY;
lfFont.lfPitchAndFamily = DEFAULT_PITCH;
hFont = CreateFontIndirect(&lfFont);
}
HDC hDC = GetDC(NULL);
if (hDC==NULL) return 0;
HGDIOBJ hOldFont = SelectObject(hDC,hFont);
MAT2 mat;
memset(&mat,0,sizeof(mat));
mat.eM11.value = 1;
mat.eM22.value = -1;
GLYPHMETRICS gm;
memset(&gm,0,sizeof(gm));
DWORD dwSize = GetGlyphOutline(hDC,ch,GGO_NATIVE,&gm,0,NULL,&mat);
int cnt = 0;
LPVOID pBuff = NULL;
if (dwSize>0)
{
pBuff = malloc(dwSize);
memset(&gm,0,sizeof(gm));
DWORD res = GetGlyphOutline(hDC,ch,GGO_NATIVE,&gm,dwSize,pBuff,&mat);
if (res!=dwSize)
{
free(pBuff);
pBuff = NULL;
}
}
if (pBuff)
{
BYTE * ptr = (BYTE *)pBuff;
while (dwSize>0)
{
TTPOLYGONHEADER * header = (TTPOLYGONHEADER *)ptr;
cnt ++;
ptr += header->cb;
dwSize -= header->cb;
}
free(pBuff);
}
SelectObject(hDC,hOldFont);
ReleaseDC(NULL,hDC);
return cnt;
}
測(cè)試:
union {
UINT ch;
char szText[4];
} a;
char * szText = "疆";
a.ch = 0;
a.szText[1] = szText[0];
a.szText[0] = szText[1];
int cnt = GetCharStrokes(a.ch);
TRACE("\"%s\"的筆畫%d\n",szText,cnt);
運(yùn)行結(jié)果:
"疆"的筆畫19