インストールされているすべての固定幅フォントを取得するにはどうすればよいですか?
質問
C#でユーザーのシステムにインストールされているすべての固定幅(モノスペース)フォントのリストを取得する簡単な方法があるかどうか疑問に思っていますか?
.net 3.5を使用しているため、WPF System.Windows.Media名前空間とLINQにアクセスしてフォント情報を取得できますが、探しているものがわかりません。
フィルタリングされた等幅フォントのリストを提供したり、より大きなフォントのリストから等幅フォントを選択したりできます(VSオプションダイアログに表示されます)。
解決
ご覧ください:
http://www.pinvoke.net/default.aspx/Structures/ LOGFONT.html
そこで構造体の1つを使用し、次にファミリをループし、フォントをインスタンス化し、LogFont値を取得してlfPitchAndFamilyを確認します。
次のコードはオンザフライで記述されており、テストされていませんが、次のようなコードが機能するはずです:
foreach (FontFamily ff in System.Drawing.FontFamily.Families)
{
if (ff.IsStyleAvailable(FontStyle.Regular))
{
Font font = new Font(ff, 10);
LOGFONT lf = new LOGFONT();
font.ToLogFont(lf);
if (lf.lfPitchAndFamily ^ 1)
{
do stuff here......
}
}
}
他のヒント
残念ながら ToLogFont 関数は、 lfPitchAndFamily フィールドに正しい値を入力しません。私の場合、常に0です。
修正される可能性のあるフォントを検出するための1つの近似は次のとおりです
foreach ( FontFamily ff in FontFamily.Families ) {
if ( ff.IsStyleAvailable( FontStyle.Regular ) ) {
float diff;
using ( Font font = new Font( ff, 16 ) ) {
diff = TextRenderer.MeasureText( "WWW", font ).Width - TextRenderer.MeasureText( "...", font ).Width;
}
if ( Math.Abs( diff ) < float.Epsilon * 2 ) {
Debug.WriteLine( ff.ToString() );
}
}
}
Wingdingsなど、いくつかの誤検知であることに注意してください
ACLは、BCLライブラリのみを使用して実行することはできません。 WinAPI相互運用機能を使用する必要があります。
の下位2ビットを分析する必要があります。 LOGFONT .lfPitchAndFamilyメンバー。 lfPitchAndFamilyのビットマスクとして使用できる定数FIXED_PITCH(フォントが固定幅であることを意味します)があります。
役立つ記事を次に示します。
フォントの列挙は少々 混乱し、あなたがしたくない限り システム上のすべてのフォントを列挙し、 より少し難しいことがあります MSDNが提案します。この記事は 必要な手順を正確に説明してください 上のすべての固定幅フォントを見つけるために使用します システム、およびすべてを列挙します 各個人の可能なサイズ フォント。