計(jì)算機(jī)二級(jí)C++技巧:漢字筆畫計(jì)算代碼

字號(hào):

通過(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