我在做ObjectARX程序,在AutoCAD中写文字时需要用到字体的文件名,但我通过CFontComboBox获取的是字体名称,如何通过字体名称获取字体文件名?
    如:通过“宋体”获取他的MS-DOS名称:SIMSUN.TTF
    网上有说通过遍历注册表,我试了,但注册表中的宋体名称为“宋体 & 新宋体 (TrueType)”  ,与 CFontComboBox中的不能匹配,高手出来指点一下啊

解决方案 »

  1.   

    使用未公开的函数:GetFontResourceInfoW
    typedef BOOL (WINAPI *PGFRI)(LPCWSTR, DWORD *, LPWSTR, DWORD); // 1. parameter : seems to be the filename [IN]
    // 2. parameter : size of the buffer [IN], size of the output [OUT]
    // 3. parameter : a buffer [OUT]
    // 4. parameter : an enumerated type
    // return value is a simple BOOL : ok / not ok // #define GetFontResourceInfo GetFontResourceInfoW HINSTANCE hDLL = LoadLibrary(_T("GDI32.DLL")); PGFRI GetFontResourceInfo = (PGFRI)GetProcAddress(hDLL, "GetFontResourceInfoW"); WCHAR fontName[] = L"Arial.ttf"; WCHAR wBuffer[1024];
    DWORD dwBufSiz = sizeof(wBuffer); // a couple values I tested GetFontResourceInfo(fontName, &dwBufSiz, wBuffer, 0); // returns 1 (0x00000001) in wBuffer
    dwBufSiz = sizeof(wBuffer);
    GetFontResourceInfo(fontName, &dwBufSiz, wBuffer, 1); // "Arial" in Unicode
    dwBufSiz = sizeof(wBuffer);
    GetFontResourceInfo(fontName, &dwBufSiz, wBuffer, 2); // a (rather) large structure with some info
    dwBufSiz = sizeof(wBuffer);
    GetFontResourceInfo(fontName, &dwBufSiz, wBuffer, 3); // nothing special
    dwBufSiz = sizeof(wBuffer);
    GetFontResourceInfo(fontName, &dwBufSiz, wBuffer, 4); // the fullpath of the file
    dwBufSiz = sizeof(wBuffer);
      

  2.   

    请在GetFontResourceInfo(fontName, &dwBufSiz, wBuffer, 2); 
    // 2. parameter : size of the buffer [IN], size of the output [OUT]里面对应,这里描述了已安装的字体文件包含的所有字体。因为是未公开的函数,请自己解析结构。
      

  3.   


    ……你自己用代码读几个系统字体文件,然后比较其返回Buffer的内容,基本就能对照着猜出来了。都说了是未公开的函数,结构肯定是未公开的。要自己动手丰衣足食。调试的时候有内存观察工具,自己看内存。先从英文字体对照起,然后用中文字体验证自己推测的是否正确。