はじめまして。
フォントファイルを指定するプログラムを書いています。
OpenFileDialogを使おうとすると、システムフォルダだからか、ファイルを指定してもうまく取得できません。
できれば FontDialog でフォントを指定して、それに対応するフォントファイル(*.ttfなど)を取得したいのですが、なにかいい方法はありますでしょうか。
自分なりの方法では、OSを取得したあとに、それに対応したレジストリ(たとえばSoftware\Microsoft\Windows\CurrentVersion\Fonts)を参照して、ファイル名を調べる方法をとりました。
現状の問題点は、
1、Windows Vistaの場合、フォントファイルの情報が格納されているレジストリの場所がわからない
2、1の理由により、できればもっと簡便な方法を採用したい
以上です。ご教授よろしくお願いします。
Win32API の SHGetFolderPath 関数を使うのが妥当でしょう。
レスが遅れて申し訳ありませんでした。
SHGetFolderPath を使えば、フォントフォルダのパスは取得できました。ありがとうございます。
ですが、ある System.Drawing.Font からフォントファイルのパスを取得する方法に苦しんでいます。上のレジストリを参照する方法では、名前が性格に1:1対応ではないので、不具合がある模様です。
System.Drawing.Font.Path のようなものがあればいいのですが・・・引き続き、よろしくお願いします。
失礼しました、質問を勘違いしていたみたいですね。
いくらか調べてみましたが、やはりレジストリから取得する以外の方法は無さそうです。
// DDK の方に FONTOBJ_pwszFontFilePaths なんて関数がありましたが、カーネルモードじゃないと呼び出せない模様。
NT 系 OS の場合、
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
に記述がありますね。
お返事、ありがとうございます。
NT系であればそこにフォント名の記載があるのは確認できていますが、上のレスで記したように、System.Drawing.Font.Name と、上記レジストリの名前がかならずしも正確に1:1対応ではないようなのです。
"&"で繋がれているものはともかく、環境によっては、 Font.Name で返される値が上記レジストリの内容に含まれないものがあるようなのです。
たとえば、英語版OSなどでは、SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts には
名前: Meiryo 値: meiryo.ttc
と記載がしてあるのに、Font.Name では『メイリオ』と返すようなことがあるようです。この場合、『メイリオ』に該当するレジストリが見つからないので、meiryo.ttc を得ることができません。
ほかに対策はないものでしょうか?
他の対策は知らないのでそちらはコメントできません。
> 環境によっては、 Font.Name で返される値が上記レジストリの内容に含まれないものがあるようなのです。
> たとえば、英語版OSなどでは、SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts には
名前: Meiryo 値: meiryo.ttc
> と記載がしてあるのに、Font.Name では『メイリオ』と返すようなことがあるようです。この場合、『メイリオ』に該当するレジストリが見つからないので、meiryo.ttc を得ることができません。
うちの日本語版 Vista でもメイリオのレジストリ上の名前では Meiryo になってますが(正確には「Meiryo & Meiryo Italic (TrueType)」)。
この動作(必ず英語名で表記される)を信じるなら、FontFamily.GetName に en-US の CultureInfo の LCID を渡せば取得できます。
あくびが出た。
>Hongliang さん
ふむふむ、なるほど、参考になります。
私の環境(日本語版、XP)だと、メイリオのレジストリ上の名前は「メイリオ & メイリオ イタリック (TrueType)」で、Font.Nameの返す値も「メイリオ」なので、必ず英語名で表記されるというわけではなさそうです。
謎は深まるばかりですね。とりあえず、すべての言語でチェックする方法で対処しようと思います。返信ありがとうございました。非常に助かりました。
大変失礼しました。解決済みのチェックを忘れていました。
自作自演おつ。
ツイート | ![]() |