Udostępnij za pośrednictwem


Instrukcje: reagowanie na zmiany schematu czcionek w aplikacji Windows Forms

W systemach operacyjnych Windows użytkownik może zmienić ustawienia czcionki dla całego systemu, aby czcionka domyślna wydawała się większa lub mniejsza. Zmiana tych ustawień czcionki ma kluczowe znaczenie dla użytkowników, którzy są niedowidzeni i wymagają większego typu odczytywania tekstu na ekranach. Aplikację Windows Forms można dostosować tak, aby reagowała na te zmiany, zwiększając lub zmniejszając rozmiar formularza oraz cały zawarty tekst za każdym razem, gdy zmienia się schemat czcionek. Jeśli chcesz, aby formularz uwzględniał zmiany w rozmiarach czcionek dynamicznie, możesz dodać kod do formularza.

Zazwyczaj czcionką domyślną używaną przez formularze systemu Windows jest czcionka zwracana przez wywołanie Microsoft.Win32 przestrzeni nazw do GetStockObject(DEFAULT_GUI_FONT). Czcionka zwrócona przez to wywołanie zmienia się tylko wtedy, gdy rozdzielczość ekranu ulegnie zmianie. Jak pokazano w poniższej procedurze, kod musi zmienić czcionkę domyślną na IconTitleFont, aby odpowiedzieć na zmiany rozmiaru czcionki.

Aby użyć czcionki komputerowej i reagować na zmiany schematu czcionek

  1. Utwórz formularz i dodaj do niego kontrolki, które chcesz. Aby uzyskać więcej informacji, zajrzyj do "Jak: Utworzyć aplikację Windows Forms z linii poleceń" oraz "Kontrolki do użycia w Windows Forms".

  2. Dodaj odwołanie do przestrzeni nazw Microsoft.Win32 do kodu.

    using Microsoft.Win32;
    
    Imports Microsoft.Win32
    
  3. Dodaj następujący kod do konstruktora formularza, aby podłączyć wymagane programy obsługi zdarzeń i zmienić domyślną czcionkę używaną dla formularza.

    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. Zaimplementuj procedurę obsługi dla zdarzenia UserPreferenceChanged, które powoduje automatyczne skalowanie formularza po zmianie kategorii Window.

    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. Na koniec zaimplementuj program obsługi zdarzenia FormClosing, który odłącza program obsługi zdarzeń UserPreferenceChanged.

    Ważne

    Niewłączenie tego kodu spowoduje przeciek pamięci w aplikacji.

    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. Skompiluj i uruchom kod.

Aby ręcznie zmienić schemat czcionek w systemie Windows XP

  1. Gdy aplikacja Windows Forms jest uruchomiona, kliknij prawym przyciskiem myszy pulpit systemu Windows i wybierz Właściwości z menu skrótów.

  2. W oknie dialogowym Właściwości wyświetlania kliknij kartę Wygląd.

  3. Z listy rozwijanej Rozmiar czcionki wybierz nowy rozmiar czcionki.

    Zauważysz, że formularz teraz reaguje na dynamiczne zmiany w schemacie czcionek systemu na pulpicie. Kiedy użytkownik zmienia między Normalne, Duże czcionki, a Bardzo duże czcionki, formularz zmienia czcionkę i skaluje się poprawnie.

Przykład

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

Konstruktor w tym przykładzie kodu zawiera wywołanie InitializeComponent, które jest definiowane podczas tworzenia nowego projektu Windows Forms w programie Visual Studio. Usuń ten wiersz kodu, jeśli tworzysz aplikację w wierszu polecenia.

Zobacz także