none
怎样取得FontFamily对象所关联的字体的文件名? RRS feed

  • 问题

  • 在写一个字体查看的程序的时候遇到了这个问题。
    FontFamily显示的名称都是字体数据里面的友好名称,现在我想取得每个FontFamily对象所对应的那个字体的文件名。
    搜索了一下,网上提供的方法都是从注册表HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts上取出文件名。
    但是我发现这个注册表位置里存储的中文字体都是用英文来显示的(比如宋体显示为Simsun)

    既然Windows的字体查看器和字体文件夹都可以显示出来对应的名称,那么应该是有办法在友好名称、注册表名称和文件名这三个字符串对应的吧?
    现在不知道该怎样做,请教各位。

    (我的程序是.NET 2.0的)


    Xlfdll
    2009年7月12日 5:22

答案

  • 你好!
         可以使用FontFamily的GetName()方法,这个方法可以用指定的语言返回FontFamily的名称
        有关可用语言和子语言的列表,请参见 Winnt.h 头文件。如果已安装了 Visual Studio,通常可以在相对于 Visual Studio 安装目录的 \\VC\PlatformSDK\Include 路径中找到该头文件。
    周雪峰
    • 已标记为答案 Xlfdll 2009年7月13日 5:30
    • 取消答案标记 Xlfdll 2009年7月13日 5:33
    • 已标记为答案 Xlfdll 2009年7月13日 10:11
    2009年7月13日 4:38
    版主
  • 之前也使用过。

    经过试验还是成功了。参考Winnt.h的头文件,我不知道是不是我自己计算的有问题,第一次直接使用头文件里面的ID总是得不到正确结果:

    #define LANG_ENGLISH                     0x09
    这是Language ID

    #define SUBLANG_ENGLISH_US                          0x01    // English (USA)
    这是Sublanguage ID

    我后来直接输入了0x0409,结果成功了(我知道0x0409是美国英语)。

    像0x0409这样的语言代码是通过这个计算出来的吗?
    #define MAKELANGID(p, s)       ((((WORD  )(s)) << 10) | (WORD  )(p))
    ————

    刚才又试验了一次,不过这次使用了CultureInfo类而没有参考Winnt.h,结果也成功了:
    String fontName = font.GetName(CultureInfo.GetCultureInfo("en-us").LCID);
    我觉得很奇怪,为什么文档不使用CultureInfo类的LCID属性而要让我们去参考比这个复杂的Winnt.h呢?

    P.S.

    顺便罗嗦一句,这个文档对Winnt.h的位置指示也是有问题的。
    VS2008的这个头文件在%ProgramFiles%\Mcrosoft SDKs\Windows\v6.0A\Include里。

    另外,谢谢您的回复!

    Xlfdll
    • 已标记为答案 Xlfdll 2009年7月13日 10:11
    • 已编辑 Xlfdll 2009年7月13日 10:13
    2009年7月13日 5:04

全部回复

  • 你好!
    不好意思!没有明白你的意思!
    你到底需要获取哪个名字啊?
    周雪峰
    2009年7月12日 14:20
    版主
  • 用宋体做例子

    .NET的FontFamily对象取得的Name属性是“宋体”
    注册表HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts里面保存的键值是Simsun:simsun.ttf
    现在我想用FontFamily对象直接得到simsun.ttf这个文件名

    我现在遇到的麻烦就是,注册表里面保存的都是中文字体的英文名称,所以我没法在.NET里直接通过查询注册表得到文件名
    Xlfdll
    2009年7月13日 3:55
  • 你好!
         可以使用FontFamily的GetName()方法,这个方法可以用指定的语言返回FontFamily的名称
        有关可用语言和子语言的列表,请参见 Winnt.h 头文件。如果已安装了 Visual Studio,通常可以在相对于 Visual Studio 安装目录的 \\VC\PlatformSDK\Include 路径中找到该头文件。
    周雪峰
    • 已标记为答案 Xlfdll 2009年7月13日 5:30
    • 取消答案标记 Xlfdll 2009年7月13日 5:33
    • 已标记为答案 Xlfdll 2009年7月13日 10:11
    2009年7月13日 4:38
    版主
  • 之前也使用过。

    经过试验还是成功了。参考Winnt.h的头文件,我不知道是不是我自己计算的有问题,第一次直接使用头文件里面的ID总是得不到正确结果:

    #define LANG_ENGLISH                     0x09
    这是Language ID

    #define SUBLANG_ENGLISH_US                          0x01    // English (USA)
    这是Sublanguage ID

    我后来直接输入了0x0409,结果成功了(我知道0x0409是美国英语)。

    像0x0409这样的语言代码是通过这个计算出来的吗?
    #define MAKELANGID(p, s)       ((((WORD  )(s)) << 10) | (WORD  )(p))
    ————

    刚才又试验了一次,不过这次使用了CultureInfo类而没有参考Winnt.h,结果也成功了:
    String fontName = font.GetName(CultureInfo.GetCultureInfo("en-us").LCID);
    我觉得很奇怪,为什么文档不使用CultureInfo类的LCID属性而要让我们去参考比这个复杂的Winnt.h呢?

    P.S.

    顺便罗嗦一句,这个文档对Winnt.h的位置指示也是有问题的。
    VS2008的这个头文件在%ProgramFiles%\Mcrosoft SDKs\Windows\v6.0A\Include里。

    另外,谢谢您的回复!

    Xlfdll
    • 已标记为答案 Xlfdll 2009年7月13日 10:11
    • 已编辑 Xlfdll 2009年7月13日 10:13
    2009年7月13日 5:04
  • 问题解决了就好!
    不用客气了!
    周雪峰
    2009年7月13日 8:07
    版主
  • 在写一个字体查看的程序的时候遇到了这个问题。
    FontFamily显示的名称都是字体数据里面的友好名称,现在我想取得每个FontFamily对象所对应的那个字体的文件名。
    搜索了一下,网上提供的方法都是从注册表HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts上取出文件名。
    但是我发现这个注册表位置里存储的中文字体都是用英文来显示的(比如宋体显示为Simsun)

    既然Windows的字体查看器和字体文件夹都可以显示出来对应的名称,那么应该是有办法在友好名称、注册表名称和文件名这三个字符串对应的吧?
    现在不知道该怎样做,请教各位。

    (我的程序是.NET 2.0的)


    Xlfdll

    感谢,已经成功调用字体名~~~
    2011年8月11日 15:53
  • VB C#里面  好像font.GetName方法不存在

    请问如果用vb写 应该怎么处理呢

    2011年8月31日 6:10