ttf字符索引到字符的转换

ttf字符索引到字符的转换

bool  GetCharByGlyphIndexes( const  LPCWSTR fontName,  const  WORD *  lpGlyphs, UINT count, BSTR *  ppChars)
{
    HDC hdcScreen 
= CreateDC("DISPLAY", NULL, NULL, NULL); 
    HDC hdcCompatible 
= CreateCompatibleDC(hdcScreen);
    KLogFont logFont(fontName);
    HFONT hFont 
= logFont.CreateHFONT(); 
    HFONT hOldFont 
= (HFONT)::SelectObject(hdcCompatible, hFont);

    DWORD fsize;
    LPGLYPHSET lgp;

    fsize 
= GetFontUnicodeRanges(hdcCompatible, NULL);
    lgp 
= (LPGLYPHSET)malloc(fsize);
    GetFontUnicodeRanges(hdcCompatible,lgp);
    std::vector
<wchar_t> vecGlyphs(count, 0);
    
for(int i = 0; i < lgp->cRanges; i++)
    
{
        
for(int j = 0; j < lgp->ranges[i].cGlyphs; j++)
        
{
            wchar_t ch 
= j + lgp->ranges[i].wcLow;//这就是包含的字符
            WORD gp = 0;
            GetGlyphIndicesW(hdcCompatible, 
&ch, 1&gp, 1);
            
for (int k = 0; k < count; ++k)
            
{
                
if (gp == lpGlyphs[k])
                
{
                    vecGlyphs[k] 
= ch;
                    
break;
                }

            }

        }

    }

    free(lgp);
    hFont 
= (HFONT)::SelectObject(hdcCompatible, hOldFont);
    ::DeleteObject(hFont);
    ::DeleteDC(hdcCompatible);
    ::DeleteDC(hdcScreen);

    
for (int i = 0; i < count; ++i)
    
{
        
if (vecGlyphs[i] == 0)
        
{
            
return false;
        }

    }


    
*ppChars = SysAllocStringLen(&vecGlyphs[0], count);
    
return true;
}

你可能感兴趣的:(ttf字符索引到字符的转换)