Partager via


Comment : répondre aux modifications de jeu de polices dans une application Windows Forms

Dans les systèmes d’exploitation Windows, un utilisateur peut modifier les paramètres de police à l’échelle du système pour rendre la police par défaut plus grande ou plus petite. La modification de ces paramètres de police est essentielle pour les utilisateurs qui sont malvoyants et nécessitent un type plus grand pour lire le texte sur leurs écrans. Vous pouvez ajuster votre application Windows Forms pour réagir à ces modifications en augmentant ou en réduisant la taille du formulaire et tout le texte contenu chaque fois que le schéma de police change. Si vous souhaitez que votre formulaire puisse prendre en charge les modifications de tailles de police dynamiquement, vous pouvez ajouter du code à votre formulaire.

En règle générale, la police par défaut utilisée par Windows Forms est la police retournée par l’appel Microsoft.Win32 d’espace de noms à GetStockObject(DEFAULT_GUI_FONT). La police retournée par cet appel change uniquement lorsque la résolution d’écran change. Comme indiqué dans la procédure suivante, votre code doit modifier la police par défaut pour IconTitleFont répondre aux modifications apportées à la taille de police.

Pour utiliser la police de bureau et répondre aux modifications apportées au schéma de police

  1. Créez votre formulaire et ajoutez les contrôles que vous souhaitez y ajouter. Pour plus d’informations, consultez Guide pratique pour créer une application Windows Forms à partir de la ligne de commande et des contrôles à utiliser sur Windows Forms.

  2. Ajoutez une référence à l’espace Microsoft.Win32 de noms à votre code.

    using Microsoft.Win32;
    
    Imports Microsoft.Win32
    
  3. Ajoutez le code suivant au constructeur de votre formulaire pour raccorder les gestionnaires d’événements requis et modifier la police par défaut utilisée pour le formulaire.

    this.Font = SystemFonts.IconTitleFont;
    SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
    this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
    
    Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
    
        ' Add any initialization after the InitializeComponent() call.
        AddHandler SystemEvents.UserPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf SystemEvents_UserPreferenceChangesEventHandler)
    End Sub
    
  4. Implémentez un gestionnaire pour l’événement qui entraîne la UserPreferenceChanged mise à l’échelle automatique du formulaire lorsque la Window catégorie change.

    void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
    {
        if (e.Category == UserPreferenceCategory.Window)
        {
            this.Font = SystemFonts.IconTitleFont;
        }
    }
    
    Private Sub SystemEvents_UserPreferenceChangesEventHandler(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs)
        If (e.Category = UserPreferenceCategory.Window) Then
            Me.Font = SystemFonts.IconTitleFont
        End If
    End Sub
    
  5. Enfin, implémentez un gestionnaire pour l’événement FormClosing qui détache le UserPreferenceChanged gestionnaire d’événements.

    Important

    L’échec de l’intégration de ce code entraîne la fuite de mémoire de votre application.

    void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
    }
    
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        RemoveHandler SystemEvents.UserPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf SystemEvents_UserPreferenceChangesEventHandler)
    End Sub
    
  6. Compilez, puis exécutez le code.

Pour modifier manuellement le schéma de police dans Windows XP

  1. Pendant que votre application Windows Forms est en cours d’exécution, cliquez avec le bouton droit sur le bureau Windows et choisissez Propriétés dans le menu contextuel.

  2. Dans la boîte de dialogue Propriétés d’affichage, cliquez sur l’onglet Apparence .

  3. Dans la zone de liste déroulante Taille de police, sélectionnez une nouvelle taille de police.

    Vous remarquerez que le formulaire réagit désormais aux modifications au moment de l’exécution dans le schéma de police de bureau. Lorsque l’utilisateur change entre les polices normales, les polices volumineuses et les polices extra larges, le formulaire modifie correctement la police et les échelles.

Exemple

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;

namespace WinFormsAutoScaling
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.Font = SystemFonts.IconTitleFont;
            SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
            this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
        }

        void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
        {
            if (e.Category == UserPreferenceCategory.Window)
            {
                this.Font = SystemFonts.IconTitleFont;
            }
        }

        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            SystemEvents.UserPreferenceChanged -= new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
        }
    }
}
Imports Microsoft.Win32

Public Class Form1
    Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        AddHandler SystemEvents.UserPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf SystemEvents_UserPreferenceChangesEventHandler)
    End Sub

    Private Sub SystemEvents_UserPreferenceChangesEventHandler(ByVal sender As Object, ByVal e As UserPreferenceChangedEventArgs)
        If (e.Category = UserPreferenceCategory.Window) Then
            Me.Font = SystemFonts.IconTitleFont
        End If
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        RemoveHandler SystemEvents.UserPreferenceChanged, New UserPreferenceChangedEventHandler(AddressOf SystemEvents_UserPreferenceChangesEventHandler)
    End Sub
End Class

Le constructeur de cet exemple de code contient un appel à InitializeComponent, qui est défini lorsque vous créez un projet Windows Forms dans Visual Studio. Supprimez cette ligne de code si vous générez votre application sur la ligne de commande.

Voir aussi