随风飘荡012 2019-06-05 19:43 采纳率: 46.7%
浏览 1030

Windows 字体文件提取字体名称

图片说明
不要下面这个函数 提取中文字体不行 有大神知道怎么提取吗

CString CVectorFontLib::GetFontNameFromFile(CString strFilePath)
{ 
    CString strFontName;
    HANDLE hFile  =  CreateFile(strFilePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        return CString();
    }
    DWORD dwRead = 0;
    TT_OFFSET_TABLE ttOffsetTable;
    ReadFile(hFile,&ttOffsetTable, sizeof(TT_OFFSET_TABLE),&dwRead,NULL);
    ttOffsetTable.uNumOfTables = SWAPWORD(ttOffsetTable.uNumOfTables);
    ttOffsetTable.uMajorVersion = SWAPWORD(ttOffsetTable.uMajorVersion);
    ttOffsetTable.uMinorVersion = SWAPWORD(ttOffsetTable.uMinorVersion);
    //check is this is a true type font and the version is 1.0
//  if(ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0)
//  {
//      return CString();
//  }
    TT_TABLE_DIRECTORY tblDir;
    BOOL bFound = FALSE;
    std::vector<char> vtBuf;
    for(int i = 0; i < ttOffsetTable.uNumOfTables; i++)
    {
        ReadFile(hFile,&tblDir, sizeof(TT_TABLE_DIRECTORY),&dwRead,NULL);

        vtBuf.resize(5);
        memset(&vtBuf[0],0,vtBuf.size());
        strncpy(&vtBuf[0],tblDir.szTag, 4);
        if(strcmp(_strlwr(&vtBuf[0]),"name") == 0)
        {
            bFound = TRUE;
            tblDir.uLength = SWAPLONG(tblDir.uLength);
            tblDir.uOffset = SWAPLONG(tblDir.uOffset);
            break;
        }
    }
    if(bFound)
    { 
        SetFilePointer(hFile,tblDir.uOffset,NULL,FILE_BEGIN);
        TT_NAME_TABLE_HEADER ttNTHeader; 
        ReadFile(hFile,&ttNTHeader,sizeof(TT_NAME_TABLE_HEADER),&dwRead,NULL);
        ttNTHeader.uNRCount = SWAPWORD(ttNTHeader.uNRCount);
        ttNTHeader.uStorageOffset = SWAPWORD(ttNTHeader.uStorageOffset);

        TT_NAME_RECORD ttRecord;
        bFound = FALSE;

        for(int i = 0; i < ttNTHeader.uNRCount; i++)
        {
            ReadFile(hFile,&ttRecord,sizeof(TT_NAME_RECORD),&dwRead,NULL);
            ttRecord.uNameID = SWAPWORD(ttRecord.uNameID);
            if(ttRecord.uNameID == 1)
            {
                ttRecord.uStringLength = SWAPWORD(ttRecord.uStringLength);
                ttRecord.uStringOffset = SWAPWORD(ttRecord.uStringOffset);

                //Get current pointer position
                DWORD dwPos = SetFilePointer(hFile,0,NULL,FILE_CURRENT);  
                SetFilePointer(hFile,tblDir.uOffset + ttRecord.uStringOffset + ttNTHeader.uStorageOffset,NULL,FILE_BEGIN);  
                vtBuf.resize(ttRecord.uStringLength + 1);
                memset(&vtBuf[0],0,vtBuf.size());
                ReadFile(hFile,&vtBuf[0],ttRecord.uStringLength,&dwRead,NULL);   
                if(strlen(&vtBuf[0]) > 0)
                {
                    strFontName = &vtBuf[0];
                    break;
                }
                SetFilePointer(hFile,dwPos,NULL,FILE_BEGIN);
            }
        }   
    }
    CloseHandle(hFile);

    return strFontName;
}


  • 写回答

1条回答 默认 最新

  • threenewbee 2019-06-05 20:15
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog