Win32APIのフォント名について質問させていただきます。
EnumFontFamiliesEx()でフォントを列挙すると、
コールバック関数にENUMLOGFONTEXが渡されますが、フォントによっては、
この構造体のelfLogFont.lfFaceNameとelfFullNameが異なっていることがあります。
例えば游明朝は、elfLogFont.lfFaceNameは"游明朝"なのに、
elfFullNameは"游明朝 Regular"となっています。
任意の場所で、LOGFONTのlfFaceNameに入っている"游明朝"という名前から、
"游明朝 Regular"という正式名を知る方法はありますでしょうか。
EnumFontFamiliesEx()を使って探していくしかないものでしょうか。
LOGFONT の lfFaceName にフォント名 ("游明朝") を設定して EnumFontFamiliesEx 関数を呼び出すと、コールバック関数の ENUMLOGFONTEX::elfFullName に "游明朝 Regular" が入っていますが、そういうことではないですか?
参考 : https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-enumfontfamiliesexa
情報ありがとうございます。
やはり、EnumFontFamiliesEx()を使って調べるしかないのですかね。
この関数はコールバックを使うので、一つの関数の中で処理をまとめられず、
探すフォント名や調べた正式名を受け渡しする必要が出てきてしまいますが、
このへんの処理を隠して、正式名を返すだけの関数を作ってみたいと思います。
フォント関連の API を探してみましたが、他には無さそうな気がします。(見落としている可能性もありますが)
コールバック関数を使うので、使い勝手は悪いですよね。
C++ ならば、クラスを作ってしまう手もあるかと思います。
思いつきですが、コンストラクタで指定されたフォントを列挙して、std::vector<> にでも格納しておき、メンバー関数でそれを取出します。
こうすれば多少はスッキリするかと思います。
ただ、FaceName に対して、FullName は一つは限らないので、それをどうするかも考えなければならないかもしれませんが。
> ただ、FaceName に対して、FullName は一つは限らないので、それをどうするかも考えなければならないかもしれませんが。
情報ありがとうございます。
LOGFONTのlfFaceNameに"游明朝"を入れてEnumFontFamiliesEx()を呼んでみたところ、elfFullNameのメンバーには"游明朝 Regular"という文字列が入っていました。
ただ、elfScriptのメンバーには"日本語"の他に、"欧文"、"ギリシャ語"など、いろいろなものが入った状態で何度も呼ばれるのですね。
言語ごとにelfFullNameが異なるようなフォントがあると、"日本語"を優先するみたいな曖昧な処理になってしまいそうですが、これしか無さそうということなので、このへんの処理を関数にまとめたいと思います。
回答2件
あなたの回答
tips
プレビュー