Question

Chaque fois que je crée un nouveau formulaire dans mon application, il utilise le code "Microsoft Sans Serif, 8.25pt". police par défaut. Je ne le modifie pas car je sais que, dans ce cas, mon formulaire devrait choisir la police par défaut utilisée par le système. Cependant, lorsque j'exécute mon application, la police utilisée est toujours autre que Segoe UI (la police système par défaut sous Windows Vista).

Pourquoi cela se produit-il? Comment puis-je m'assurer que mon application ressemble à une application Windows normale?

Était-ce utile?

La solution

Découvrez cette entrée de blog sur le sujet police par défaut dans les formulaires qui entraîne le problème que vous rencontrez et ce Bug de connexion avec la réponse de Microsoft. En bref, il semble simplement que Forms ne reçoive pas la police (correcte) par défaut de Windows (que vous avez modifiée).

Autres conseils

La réponse acceptée ne répond pas vraiment à la question; cela explique simplement pourquoi ce problème se produit.

Certaines des autres réponses proposent des solutions de contournement solides, mais j’ai constaté que la meilleure solution consiste à créer un formulaire de base dont tous les formulaires de votre application héritent et à définir la propriété Font de ce formulaire de base sur SystemFonts. .MessageBoxFont dans le constructeur. Cela garantit non seulement que votre application sélectionne la police correcte au moment de l'exécution, en fonction de l'environnement de l'utilisateur (pour éviter le problème potentiel posé par Hans Passant & # 8212; un XP sans Office 2007 aura recours à Microsoft Sans Serif en l'absence de Segoe UI), mais vous offre également la prise en charge au moment de la conception de votre police Windows actuelle. Josuegomes souligne que l’utilisation de la police correcte au moment du design résout le problème, car tout contrôle de conteneur créé sur le formulaire prendra la police utilisée par le formulaire au moment du design.

Outre les avantages ci-dessus, cela vous évite d'avoir à vous rappeler de modifier le constructeur pour chaque formulaire que vous créez, garantit la cohérence entre tous les formulaires de votre application, et vous permet également de placer d'autres fonctionnalités communes. J'utilise cela de différentes manières, telles que p / invocation, etc. pour corriger des bogues dans l'implémentation WinForms.

Le seul problème qui reste avec cette approche est si vous souhaitez définir un style de police pour un contrôle particulier, tel que gras. Le meilleur endroit pour le faire est toujours dans le constructeur de cette fiche, en commençant par la police de la fiche et en modifiant le style:

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

Vous pouvez ajouter avant InitializeComponent () dans le ou les constructeurs de formulaire:

this.Font = SystemFonts.MessageBoxFont;

Cela semble fonctionner avec Windows XP et Windows Vista.

Oui, il utilise la police renvoyée par GetStockObject (DEFAULT_GUI_FONT) . Qui est MS Sans Serif. Une ancienne police, disparue depuis longtemps de la plupart des machines. Le mappeur de polices le traduit, sans surprise, Microsoft Sans Serif.

Il n’existe aucune procédure documentée à ma connaissance pour modifier cette police par défaut. Les documents du SDK mentionnent explicitement MS Sans Serif. Si vous voulez Segoe, vous devrez le demander. Ce qui n’est pas sûr, c’est qu'il reste encore beaucoup de machines XP sans Office 2007. Le mappeur de polices le traduira sur une machine sur laquelle Segoe n'est pas disponible. Je ne sais pas ce qui va sortir, je n'ai plus une telle machine.

La définition de la propriété Font du formulaire sur SystemFonts.DialogFont ne fonctionne pas si vous avez des zones de groupe avec des contrôles associés. Les contrôles de la zone de groupe ne sont pas affectés par la propriété Font du formulaire. J'ai "résolu" ceci en définissant la propriété Font sur SystemFonts.DialogFont pour chaque zone de groupe.

Les contrôles de la zone de groupe ne sont en effet pas affectés par la propriété Font du formulaire. La raison en est que les contrôles dans les contrôles de conteneur sont traités comme des enfants des contrôles de conteneur comme groupbox, mais pas des enfants du formulaire principal. Pour que toutes les commandes, y compris celles des zones de groupe, soient correctement dimensionnées, vous pouvez utiliser un code similaire à ci-dessous:

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

Essayez ceci, cliquez sur un formulaire et modifiez la taille de la police. Par exemple, j'ai modifié la taille de police du formulaire en 12pt, puis effectuez un test en faisant glisser la zone de texte sur le formulaire. Vous verrez, la taille de la zone de texte est également passée à 12 pt. Je viens de recevoir cette solution par accident.

Control.DefaultFont est en lecture seule; un hacky devait écraser c'est utiliser la réflexion.

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

Assurez-vous que l’UT garde un oeil sur ce code. Aucun contrat d’API ne vous protège si l’implémentation de Framework est modifiée.

Sachez également que le concepteur de formulaires insère généralement la police textuelle dans les classes .designer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top