42

アプリケーションで新しいフォームを作成するたびに、デフォルトで「Microsoft Sans Serif、8.25pt」フォントが使用されます。この場合、システムのデフォルトフォントが何であれ、フォームが取得する必要があることがわかっているため、変更しません。ただし、アプリケーションを実行すると、使用されるフォントはSegoe UI(Windows Vista OSのデフォルトのシステムフォント)以外のものになります。

なぜこれが起こるのですか?アプリケーションが通常のWindowsアプリケーションのように見えることを確認するにはどうすればよいですか?

4

11 に答える 11

48

受け入れられた答えは、実際には質問に答えません。この動作が発生する理由を説明するだけです。

他の回答のいくつかは確実な回避策を提案していますが、アプリケーション内のすべてのフォームが継承する基本フォームを作成SystemFonts.MessageBoxFontし、コンストラクターでこの基本フォームの Font プロパティを設定することが最善の解決策であることがわかりました。これにより、ユーザーの環境に基づいてアプリケーションが実行時に正しいフォントを選択することが保証されるだけでなく (Hans Passant によって引き起こされる潜在的な問題を回避できます。Office 2007 のない XP は、Segoe UI がない場合に Microsoft Sans Serif に頼ることになります)。 ) だけでなく、現在の Windows フォントのデザイン時のサポートも提供します。設計時に正しいフォントを使用すると、フォーム上に作成されたコンテナ コントロールが設計時にフォームで使用されるフォントを取得するため、Josuegomes 氏が指摘する問題が解決されます。

上記の利点に加えて、これにより、作成するフォームごとにコンストラクターを変更することを覚えておく必要がなくなり、アプリケーション内のすべてのフォームにわたって一貫性が保証され、他の共通機能を配置する場所が提供されます。これを p/invoking などのいくつかの異なる方法で使用して、WinForms 実装のバグを修正します。

この方法で残る唯一の問題は、太字などの特定のコントロールのフォント スタイルを設定する場合です。これを行うのに最適な場所は、フォームのコンストラクターで、フォームのフォントをベースとして開始し、そこからスタイルを変更します。

myControl.Font = New Font(Me.Font, FontStyle.Bold)
于 2010-11-02T09:02:52.103 に答える
34

Form コンストラクターの InitializeComponent() の前に追加できます。

this.Font = SystemFonts.MessageBoxFont;

これは、Windows XP および Windows Vista で動作するようです。

于 2009-01-20T12:39:01.270 に答える
14

発生している問題につながるFormsのデフォルトのフォントと、このConnect BugwithMicrosoftの応答について説明しているこのブログエントリを確認してください。つまり、Formsは(変更した)デフォルトのWindowsフォントを取得していないようです。

于 2008-11-24T06:11:14.547 に答える
11

はい、 によって返されたフォントを使用しGetStockObject(DEFAULT_GUI_FONT)ます。MSサンセリフです。ほとんどのマシンから消えて久しい古いフォント。フォント マッパーはそれを Microsoft Sans Serif に変換します。

そのデフォルトのフォントを変更するための文書化された手順はありません。SDK のドキュメントでは、MS Sans Serif について明示的に言及しています。Segoe が必要な場合は、それを要求する必要があります。これは安全ではありません。Office 2007 がインストールされていない XP マシンがまだたくさんあります。フォント マッパーは、Segoe を使用できないマシンでフォントを変換します。何が飛び出すかわからない、もうそのようなマシンは残っていません。

于 2008-11-18T20:45:57.200 に答える
2

グループ ボックス内のコントロールは、フォームの Font プロパティの影響を受けません。その理由は、コンテナー コントロール内のコントロールは、グループ ボックスのようなコンテナー コントロールの子として扱われますが、メイン フォームの子として扱われないためです。グループボックス内のコントロールを含むすべてのコントロールを適切にスケーリングするには、以下のようなコードを使用できます。

        foreach (Control ctr in this.Controls)
        {
            ctr.Font = SystemFonts.IconTitleFont;

            // controls in groupboxes are not child of main form
            if (ctr.HasChildren)
            {
                foreach (Control childControl in ctr.Controls)
                {
                    childControl.Font = SystemFonts.IconTitleFont;
                }
            }        
        }
于 2011-10-21T18:12:24.700 に答える
1

Control.DefaultFont読み取り専用です。ハッキーの 1 つは、上書きすることでした。リフレクションを使用することです。

Type settingsType = typeof(Control);
var defaultFontField = settingsType.GetField("defaultFont", BindingFlags.Static | BindingFlags.NonPublic);
defaultFontField.SetValue(null, new Font("Segoe UI", 8.25F));

フレームワークの実装が変更された場合に保護する API コントラクトはありません。

また、ほとんどの場合、.designer クラスにフォントを逐語的に挿入するフォーム デザイナーにも注意してください。

于 2015-11-18T08:40:23.353 に答える
1

コントロールが関連付けられたグループ ボックスがある場合、フォームの Font プロパティを SystemFonts.DialogFont に設定しても機能しません。グループ ボックス内のコントロールは、フォームの Font プロパティの影響を受けません。すべてのグループ ボックスの Font プロパティを SystemFonts.DialogFont に設定することで、これを「解決」しました。

于 2009-09-02T19:59:26.680 に答える
0

net472/net48と の両方を対象とするサンプル アプリを試しましたnetcoreapp3.1。.net アプリControl.DefaultFontは常に Microsoft Sans Serif を返し、スケーリングされません。しかし、.net コア 3.1 アプリControl.DefaultFontは、win7/10 のシステム フォントを正確に返し、適切にスケーリングされます。それで、彼らはついにこれをコアで修正したと思います。

于 2020-05-01T17:57:29.693 に答える