다음을 통해 공유


방법: Windows Forms 애플리케이션에서 글꼴 구성표 변경 내용에 대응

Windows 운영 체제에서 사용자는 시스템 전체의 글꼴 설정을 변경하여 기본 글꼴을 더 크게 또는 더 작게 표시할 수 있습니다. 이러한 글꼴 설정을 변경하는 것은 시각 장애가 있고 화면의 텍스트를 읽기 위해 더 큰 활자가 필요한 사용자에게 중요합니다. 글꼴 구성표가 변경될 때마다 양식 및 포함된 모든 텍스트의 크기를 늘리거나 줄여 이러한 변경 내용에 대응하도록 Windows Forms 애플리케이션을 조정할 수 있습니다. 양식에서 글꼴 크기의 변경 내용을 동적으로 수용하도록 하려면 양식에 코드를 추가할 수 있습니다.

일반적으로 Windows Forms에서 사용하는 기본 글꼴은 GetStockObject(DEFAULT_GUI_FONT)에 대한 Microsoft.Win32 네임스페이스 호출에서 반환된 글꼴입니다. 이 호출에서 반환된 글꼴은 화면 해상도가 변경되는 경우에만 변경됩니다. 다음 절차와 같이 코드는 글꼴 크기 변경에 대응하도록 기본 글꼴을 IconTitleFont로 변경해야 합니다.

바탕 화면 글꼴을 사용하고 글꼴 구성표 변경 내용에 대응하려면

  1. 양식을 만들고 원하는 컨트롤을 추가합니다. 자세한 내용은 방법: 명령줄에서 Windows Forms 애플리케이션 만들기Windows Forms에서 사용할 컨트롤을 참조하세요.

  2. 코드에 Microsoft.Win32 네임스페이스에 대한 참조를 추가합니다.

    using Microsoft.Win32;
    
    Imports Microsoft.Win32
    
  3. 양식의 생성자에 다음 코드를 추가하여 필수 이벤트 처리기를 연결하고 양식에 사용 중인 기본 글꼴을 변경합니다.

    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. Window 범주가 변경될 때 양식의 크기가 자동으로 조정되도록 하는 UserPreferenceChanged 이벤트에 대한 처리기를 구현합니다.

    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. 마지막으로 UserPreferenceChanged 이벤트 처리기를 분리하는 FormClosing 이벤트에 대한 처리기를 구현합니다.

    중요

    이 코드를 포함하지 않으면 애플리케이션에서 메모리가 누수가 발생합니다.

    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. 코드를 컴파일하고 실행합니다.

Windows XP에서 글꼴 구성표를 수동으로 변경하려면

  1. Windows Forms 애플리케이션이 실행되는 동안 Windows 바탕 화면을 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 속성을 선택합니다.

  2. 디스플레이 속성 대화 상자에서 모양 탭을 클릭합니다.

  3. 글꼴 크기 드롭다운 목록 상자에서 새 글꼴 크기를 선택합니다.

    이제 양식이 바탕 화면 글꼴 구성표의 런타임 변경 내용에 대응한다는 것을 알 수 있습니다. 사용자가 일반, 큰 글꼴아주 큰 글꼴 간에 변경하면 양식의 글꼴이 변경되고 올바르게 크기를 조정합니다.

예제

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

이 코드 예제의 생성자는 Visual Studio에서 새 Windows Forms 프로젝트를 만들 때 정의되는 InitializeComponent에 대한 호출을 포함합니다. 명령줄에서 애플리케이션을 빌드하는 경우 이 코드 줄을 제거합니다.

참고 항목