找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 755|回复: 10

[求助]:关于TrueType字体文件信息的获取!!!

[复制链接]
发表于 2003-8-28 10:00:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
请问各位我如何通过一个字体文件的文件名(如FZSTK.TTF,方正舒体的TTF文件)来获得该字体文件的字体名称以及该字体的相关信息。

即要实现以下功能:
input:一个ttf文件(FZSTK.TTF)
output:该文件包含的字体名称(方正舒体)

先谢谢各位了!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-8-28 11:12:25 | 显示全部楼层

关于ttf

在windows中取得字体名的方法一般使用
EnumFontFamiliesEx函数
例如:

  1. [FONT=courier new]

  2. CWindowDC dc(NULL);
  3. CStringArray m_listfacename;
  4. m_listfacename.RemoveAll();
  5. ZeroMemory(&lf,sizeof(lf));
  6. lf.lfCharSet = ANSI_CHARSET;
  7. if (!EnumFontFamiliesEx( dc.m_hDC,&lf,(FONTENUMPROC)EnumFontFamExProc,
  8.                                 (LPARAM)(&m_listfacename),
  9.                                 (DWORD) 0));



  10. BOOL CALLBACK CXTFontEnum::EnumFontFamExProc(ENUMLOGFONTEX* pelf,
  11.         NEWTEXTMETRICEX* lpntm, DWORD dwFontType, LPARAM lParam)
  12. {
  13.         UNREFERENCED_PARAMETER( lpntm );
  14.        
  15.         CStringArray* pFontEnum = reinterpret_cast< CStringArray* >( lParam );
  16.         if ( pFontEnum != NULL )
  17.         {
  18.                 pFontEnum->Add(pelf->elfLogFont.lfFaceName);
  19.         }
  20.        
  21.         return TRUE;
  22. }
  23. [/FONT]
复制代码

ttf字体是windows管理的资源,如果创建了一个ttf字体文件,把它拷贝到系统字体文件目录下就可以使用该字体了。如果不由windows进行管理,可能会很麻烦的。
在autocad中,字体文件的管理可以分成两部分,shx可以通过文件遍历的方法取得,在处理完shx字体之后再处理ttf字体。autocad本身也是将shx和ttf当成两种资源处理的。例如:使用ttf创建文字样式时不能使用大字体,同时使用的函数为setfont,要求的参数为字面名称;使用shx创建字体样式使用setfilename,同时可以使用大字体.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-28 11:25:35 | 显示全部楼层

Re: 关于ttf

最初由 Echoyin 发布
[B]在windows中取得字体名的方法一般使用
EnumFontFamiliesEx函数
例如:
[CODE]


CWindowDC dc(NULL);
CStringArray m_listfacename;
m_listfacename.RemoveAll();
ZeroMemory(&lf,sizeof... [/B]


谢谢Echoyin!!
不过我要的是通过ttf文件获得字体名称,并不是直接获取已知的windows字体名称,换句话说就是直接通过读取ttf文件来获得字体名称,有解决的办法吗??
:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-8-28 12:33:06 | 显示全部楼层

我也不是很清楚

我也不是很清楚.
你可以到MSDN中查一查以下几个函数:
CreateScalableFontResource
AddFontResource
基本思路是将ttf加到系统字体表中,然后使用windows提供的字体操纵API来搞定
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-28 12:50:30 | 显示全部楼层
我就是要实现AcGiTextStyle::setFileName函数的功能,通过输入一个TTF文件的文件名称,最后得到TTF文件所包含的字体名称以及字体相关的信息,也就是最终得到LOGFONT所需要的字体信息。
可又具体的解决方案???

virtual void setFileName(
const char* fontName);

fontName Input a font file name with an .shx, .pfa, .pfb, or .ttf extension

Sets fontName to be the font file name used by the AcGiTextStyle object. The font file must have one of the following extensions: .shx, .pfa, .pfb, or .ttf.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-8-28 15:29:08 | 显示全部楼层

为什么不使用setfont呢?

为什么不使用字体名呢?
例如:先遍历字体,然后根据字体创建CFont对象。
如果要使用字体文件名为参数和大多数windows程序的习惯不符啊!当然也可以解决,可能要了解ttf文件的格式吧,这样可能也不是很爽,因为除了ttf文件之外还有其他的文件存储了truetype字体,例如:宋体就是存在simsun.ttc中的。还有,你就是提取了字面名也没有用,因为字体还有字符集、精度等等属性,是不是要全部提取出来啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-28 17:40:33 | 显示全部楼层
因为在ARX二次开发中可以通过AcGiTextStyle::setFileName 来设置字体的,
这个filename可以是个.shx, .pfa, .pfb, or .ttf.文件。
我就是要解决如何实现类似于AcGiTextStyle::setFileName()方法的这个问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-29 11:59:15 | 显示全部楼层
别人帮着写了一个提取TTF文件字体名称的函数,供大家研究!!!

<br />
</font><blockquote><font face="宋体,verdana,arial,helvetica" >code:</font>
<TABLE cellSpacing=0 cellPadding=0 bgColor='#ffffff' width=90% align=center><TR><TD><TABLE cellSpacing=1 cellPadding=2 border=0  width=100%><tr><td bgcolor='#F3F3F3'><pre>
<font face="courier new">

void GetFontNameFromFileName(CString fontfilename, CString &fontfullname)
{
        // TODO: Add your control notification handler code here
        FILE                        *pfTTF;
        char                        buffer[32], stringbuf[1024]="", *p;
        WCHAR                        wstr[1024];
        long                        index, tablength;
        unsigned short        tablrecnum, stroffset;
        bool                        hasname = false;
        unsigned short        platformID, encodingID, languageID, nameID, strlength, strnearoffset;
        CString                        ttffilename;
        LANGID                        langID;

        langID = GetSystemDefaultLangID();
        ttffilename =fontfilename;
        pfTTF = _fsopen(ttffilename, "rb", _SH_DENYWR);
        if (pfTTF)
        {
                fseek(pfTTF, 12L, SEEK_SET); // seek to table directory
                while (!hasname)
                {
                        if (fread(buffer, sizeof(char), 16, pfTTF) != 16)
                                break;
                        if (buffer[0] == 'n' && buffer[1] == 'a'
                                && buffer[2] == 'm' && buffer[3] == 'e')
                                hasname = true;
                }
                if (hasname)
                {
                        index = (((long)(unsigned char)buffer[8]) << 24)
                                        + (((long)(unsigned char)buffer[9]) << 16)
                                        + (((long)(unsigned char)buffer[10]) << 8)
                                        + (unsigned char)buffer[11];
                        tablength = (((long)(unsigned char)buffer[12]) << 24)
                                        + (((long)(unsigned char)buffer[13]) << 16)
                                        + (((long)(unsigned char)buffer[14]) << 8)
                                        + (unsigned char)buffer[15];
                        fseek(pfTTF, index, SEEK_SET); // seek to name table entry
                        fread(buffer, sizeof(char), 6, pfTTF);
                        tablrecnum = (((unsigned short)(unsigned char)buffer[2]) << 8)
                                        + (unsigned char)buffer[3];
                        stroffset = (((unsigned short)(unsigned char)buffer[4]) << 8)
                                        + (unsigned char)buffer[5];
                        for (int i = 0; i<tablrecnum; i++)
                        {
                                fseek(pfTTF, (long)(index+6+i*12), SEEK_SET);
                                if (fread(buffer, sizeof(char), 12, pfTTF) != 12)
                                        break;
                                platformID = (((unsigned short)(unsigned char)buffer[0]) << 8) + (unsigned char)buffer[1];
                                encodingID = (((unsigned short)(unsigned char)buffer[2]) << 8) + (unsigned char)buffer[3];
                                languageID = (((unsigned short)(unsigned char)buffer[4]) << 8) + (unsigned char)buffer[5];
                                if (languageID != langID && PRIMARYLANGID(languageID) != LANG_ENGLISH)
                                        continue;
                                nameID = (((unsigned short)(unsigned char)buffer[6]) << 8) + (unsigned char)buffer[7];
                                if (nameID != 4)
                                        continue;
                                strlength = (((unsigned short)(unsigned char)buffer[8]) << 8) + (unsigned char)buffer[9];
                                if (strlength >= 1024)
                                        strlength = 1023;
                                strnearoffset = (((unsigned short)(unsigned char)buffer[10]) << 8) + (unsigned char)buffer[11];
                                fseek(pfTTF, (long)(index+stroffset+strnearoffset), SEEK_SET);
                                if (fread(stringbuf, sizeof(char), strlength, pfTTF) != strlength)
                                        break;
                                stringbuf[strlength] = '\0';
                                if (platformID == 3 )
                                {
                                        int j=0;
                                        p = stringbuf;
                                        strlength /= 2;
                                        while(j < strlength)
                                        {
                                                wstr[j] = ((unsigned char)*p);
                                                wstr[j] = wstr[j] << 8;
                                                p++;
                                                wstr[j] += ((unsigned char)*p);
                                                p++;
                                                j++;
                                        }
                                        wstr[j] = 0;
                                }
                                switch(nameID)
                                {
                                default:
                                        break;
                                case 4: // Full fontname
                                        if (platformID == 3 )
                                                fontfullname = wstr;
                                        else
                                                fontfullname = stringbuf;
                                        break;
                                }
                        }
                }
                fclose(pfTTF);
        }
        else
        {
                fontfullname = fontfilename.Left(fontfilename.GetLength() - 4);
        }
}



</font>
</pre></TD></tr></TABLE></TD></TR></TABLE><font face="宋体,verdana, arial, helvetica" style="font-size: 10pt"></blockquote><br />
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-9 06:21:19 | 显示全部楼层
HillMan 兄:
    代码怎么不对?
    for (int i = 0; i          此句不全,能否补上?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-9 08:27:04 | 显示全部楼层
for (int i = 0; i < tablrecnum; i++ )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-9 22:32:15 | 显示全部楼层
cutechun 兄:
  多谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 17:48 , Processed in 0.570810 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表