質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

1379閲覧

フォントの正式名を知りたい

n_ito

総合スコア14

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

1クリップ

投稿2022/05/23 23:56

Win32APIのフォント名について質問させていただきます。

EnumFontFamiliesEx()でフォントを列挙すると、
コールバック関数にENUMLOGFONTEXが渡されますが、フォントによっては、
この構造体のelfLogFont.lfFaceNameとelfFullNameが異なっていることがあります。

例えば游明朝は、elfLogFont.lfFaceNameは"游明朝"なのに、
elfFullNameは"游明朝 Regular"となっています。

任意の場所で、LOGFONTのlfFaceNameに入っている"游明朝"という名前から、
"游明朝 Regular"という正式名を知る方法はありますでしょうか。
EnumFontFamiliesEx()を使って探していくしかないものでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

n_ito

2022/05/25 07:25

情報ありがとうございます。 やはり、EnumFontFamiliesEx()を使って調べるしかないのですかね。 この関数はコールバックを使うので、一つの関数の中で処理をまとめられず、 探すフォント名や調べた正式名を受け渡しする必要が出てきてしまいますが、 このへんの処理を隠して、正式名を返すだけの関数を作ってみたいと思います。
Bull

2022/05/25 08:48

フォント関連の API を探してみましたが、他には無さそうな気がします。(見落としている可能性もありますが) コールバック関数を使うので、使い勝手は悪いですよね。 C++ ならば、クラスを作ってしまう手もあるかと思います。 思いつきですが、コンストラクタで指定されたフォントを列挙して、std::vector<> にでも格納しておき、メンバー関数でそれを取出します。 こうすれば多少はスッキリするかと思います。 ただ、FaceName に対して、FullName は一つは限らないので、それをどうするかも考えなければならないかもしれませんが。
n_ito

2022/05/30 01:58

> ただ、FaceName に対して、FullName は一つは限らないので、それをどうするかも考えなければならないかもしれませんが。 情報ありがとうございます。 LOGFONTのlfFaceNameに"游明朝"を入れてEnumFontFamiliesEx()を呼んでみたところ、elfFullNameのメンバーには"游明朝 Regular"という文字列が入っていました。 ただ、elfScriptのメンバーには"日本語"の他に、"欧文"、"ギリシャ語"など、いろいろなものが入った状態で何度も呼ばれるのですね。 言語ごとにelfFullNameが異なるようなフォントがあると、"日本語"を優先するみたいな曖昧な処理になってしまいそうですが、これしか無さそうということなので、このへんの処理を関数にまとめたいと思います。
guest

回答2

0

自己解決

情報ありがとうございます。
LOGFONTのlfFaceNameに"游明朝"を入れてEnumFontFamiliesEx()を呼んでみたところ、elfFullNameのメンバーには"游明朝 Regular"という文字列が入っていました。

ただ、elfScriptのメンバーには"日本語"の他に、"欧文"、"ギリシャ語"など、いろいろなものが入った状態で何度も呼ばれるのですね。
言語ごとにelfFullNameが異なるようなフォントがあると、"日本語"を優先するみたいな曖昧な処理になってしまいそうですが、これしか無さそうということなので、このへんの処理を関数にまとめたいと思います。

投稿2022/05/30 08:49

n_ito

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bull

2022/05/31 07:58

解決しているのに余計なことですが、ちょっと気になったので。 EnumFontFamiliesEx() は lfFaceName の他にも、lfCharSet を指定することができます。 lfCharSet を指定すれば、指定した文字セットのみを列挙してくれます。 例えば、lfCharSet = SHIFTJIS_CHARSET、lfFaceName = "游明朝" として、EnumFontFamiliesEx() を呼び出すと、コールバック関数は一度しか呼ばれません。 また、フォントによっては一つの FaceName に対して、複数の FullName を持っているものもあります。 例えば、"メイリオ" は"メイリオ"、"メイリオ イタリック"、"メイリオ ボールド"、"メイリオ ボールド イタリック"とコールバック関数が4回呼ばれることになります。
n_ito

2022/06/01 05:45

ご指摘いただきありがとうございます。 確かにメイリオに対しては、"メイリオ イタリック"や"メイリオ ボールド"などが入っていて、 自分が期待していた動作とは違いました。 ボールドやイタリックのときは、elfLogFontのlfWeightやlfItalicの値が入っていたので、 このへんの値も使って判定すれば名称のみを探すことはできそうではありますが、 フォントによってこんなに内部の処理が異なるものなのですね。
n_ito

2022/06/07 01:52

EnumFontFamiliesEx()に渡すLOGFONTのlfFaceNameに、 "メイリオ"ではなく空文字を入れると、 "メイリオ イタリック"や"メイリオ ボールド"ではなく、 "メイリオ"のみが返ってくるようです。 もちろん、他のフォントも列挙されるので、 コールバック関数の中でelfLogFont.lfFaceNameを比較する必要がありますが、 こうすることで、メイリオのときは"メイリオ"、 游明朝のときは"游明朝 Regular"が返ってくるようにできそうです。 https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-enumfontfamiliesexa lfFaceNameの説明を読んでも、この動作になることは理解できませんでした。 (ただの絞り込みだと思ってました) アドバイスありがとうございます。
guest

0

「コントロール パネル\すべてのコントロール パネル項目\フォント\游明朝」を見れば、
游明朝 細字、游明朝 中太、游明朝 標準
の3つがあり、
「游明朝 標準」をクリックすれば
下記のような表示になるかと思います。
イメージ説明

ウィンドウタイトルに出ているのが、elfFullName由来で、
「フォント名」にはelfLogFont.lfFaceName由来(フォント ファミリ)で表示されていように見えますが。

投稿2022/05/24 00:19

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

n_ito

2022/05/24 00:47

情報ありがとうございます。 コントロールパネルでもこの名前が使われているのですね。 こちらの環境でも同じようにタイトルバーに表示されていました。 ただ、ちょっと文章が足りなかったようで申し訳ありませんが、 Win32APIを使ったプログラム上で、LOGFONTのlfFaceNameに入っている文字列から この正式名を取得できる方法が存在するのかという疑問です。 引数に"游明朝"が入ったLOGFONTのlfFaceNameを渡し、 "游明朝 Regular"が返ってくるような関数などは存在せず、 自力でEnumFontFamiliesEx()を使って探していくしかないのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問