質問

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

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

役に立ちましたか?

解決

ブログエントリをご覧ください。発生している問題につながるFormsのデフォルトフォントと、この接続バグ Microsoftの応答。要するに、Formsは(正しい)デフォルトのWindowsフォント(変更した)を取得していないようです。

他のヒント

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

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

上記の利点に加えて、これにより、作成する各フォームのコンストラクターを変更することを忘れずに済み、アプリケーション内のすべてのフォームの一貫性を確保し、他の一般的な機能を配置する場所を提供します。これをp / invokingなどのいくつかの異なる方法で使用して、WinForms実装のバグを修正します。

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

myControl.Font = New Font(Me.Font, FontStyle.Bold)

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

this.Font = SystemFonts.MessageBoxFont;

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

はい、 GetStockObject(DEFAULT_GUI_FONT)によって返されるフォントを使用します。これはMS Sans Serifです。ほとんどのマシンで長い間使用されていない古いフォント。フォントマッパーは、それをMicrosoft Sans Serifに変換します。当然です。

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

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

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

        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;
                }
            }        
        }

これを試して、フォームをクリックしてフォントサイズを変更します。たとえば、フォームのフォントサイズを12ptに変更し、テキストボックスをフォームにドラッグしてテストします。テキストボックスのサイズも12ptに変更されます。偶然この解決策を見つけました。

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));

このコードを監視するUTを必ず用意してください。フレームワークの実装が変更された場合にあなたを保護するAPI契約はありません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top