

フォント名からフォントファイル名（*.ttf）を取得したいと考えています。  
例：Times New Roman → times.ttf

（ここでのフォント名とは、LOGFONT 構造体の lfFaceName で取得できる名前のことです。）

下記の内容を参考に、レジストリの  
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts  
を参照することを試みています。

参考：<https://stackoverflow.com/questions/11387564/get-a-font-filepath-from-
name-and-style-in-c-windows>

一般的に、英語のフォントであれば lfFaceNameとレジストリに格納されているフォント名が一致するので問題ないのですが、日本語フォントの場合は
lfFaceName が日本語で（例：メイリオ）、レジストリで使われているフォント名が英語（例：Meiryo ）であったりして、一致しません。

問題解決のために、lfFaceName で得られる日本語フォント名から、英語のフォント名を取得する方法をお教えいただければ幸いです。

英語のフォント名を取得することが目的ではなくて、フォントファイル名（*.ttf）を取得することが本来の目的ですので、まったく異なる方法で達成できるのでしたら、その方法をお教えいただければ幸いです。


CC BY-SA 3.0
2015-10-17T03:38:04.303
17741
2015-10-18T13:54:36.870
2017-05-23T12:38:56.083
-1
12817
question
c++ windows font
フォント名からフォントファイル名(*.ttf) を取得するには？(C++ / Windows)


ファイル名を取得する方法は分かりませんので、英語の名前を取得する方法を回答します。

GDI+の[FontFamily.GetFamilyName](https://msdn.microsoft.com/en-
us/library/windows/desktop/ms536177.aspx)を使用すると、他の言語での名称を取得できます。言語IDを指定する仮引数があるので、英語なら`MAKELANGID(LANG_ENGLISH,
SUBLANG_ENGLISH_US)`を渡すと良いです。

[code]

    #include <iostream>
    #include <windows.h>
    #include <gdiplus.h>
    
    using namespace std;
    
    int main()
    {
        std::wcout.imbue(std::locale(""));
    
        Gdiplus::GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;
        Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr);
    
        Gdiplus::FontFamily f(L"メイリオ");
    
        WCHAR name[LF_FACESIZE]{};
        f.GetFamilyName(name, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
        wcout << name << endl;
    
        //Gdiplus::GdiplusShutdown(gdiplusToken);
    }
    
[/code]

このプログラムを実行すると、`Meiryo`という出力が得られます。

ただし、この方法にも1つ問題があります。日本語環境で`L"微软雅黑"`（Microsoft YaHeiの中国語簡体字表記）を指定しても、Microsoft
YaHeiになりません。そのように、使用中の言語以外ではうまくいかないようです。このあたりをなんとかする方法はちょっと分かりませんでした。


CC BY-SA 3.0
2015-10-18T13:49:28.207
17779
2015-10-18T13:54:36.870
2015-10-18T13:54:36.870
8616
8616
17741
answer