汉字笔画计算:汉字笔画计算代码



通过提取楷体字形轮廓可以获得汉字笔画只不过选用字体必须是楷体其他字体不行
这功能没什么用途吧我只是好玩而已


GetCharStrokes(UINT ch)
{
HFONT hFont;
{ // create font;
LOGFONT lfFont;
mem(&lfFont, 0, (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);
(hDCNULL) 0;

HGDIOBJ hOldFont = SelectObject(hDC,hFont);

MAT2 mat;
mem(&mat,0,(mat));
mat.eM11.value = 1;
mat.eM22.value = -1;

GLYPHMETRICS gm;
mem(&gm,0,(gm));

DWORD dwSize = GetGlyphOutline(hDC,ch,GGO_NATIVE,&gm,0,NULL,&mat);

cnt = 0;
LPVOID pBuff = NULL;

(dwSize>0)
{
pBuff = malloc(dwSize);
mem(&gm,0,(gm));

DWORD res = GetGlyphOutline(hDC,ch,GGO_NATIVE,&gm,dwSize,pBuff,&mat);
(res!=dwSize)
{
free(pBuff);
pBuff = NULL;
}
}

(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);

cnt;
}


测试:

union {
UINT ch;
char szText[4];
} a;

char * szText = "疆";

a.ch = 0;
a.szText[1] = szText[0];
a.szText[0] = szText[1];

cnt = GetCharStrokes(a.ch);
TRACE("\"%s\"笔画%d\n",szText,cnt);
运行结果:
"疆"笔画19
Tags:  汉字笔画 汉字笔画计算

延伸阅读

最新评论

发表评论