Windows Forms의 자동 크기 조정Automatic scaling in Windows Forms

자동 크기 조정은 한 컴퓨터에서 특정 디스플레이 해상도 또는 시스템 글꼴로 디자인된 폼과 해당 컨트롤이 다른 디스플레이 해상도 또는 시스템 글꼴을 사용하는 다른 컴퓨터에서 제대로 표시될 수 있게 합니다.Automatic scaling enables a form and its controls, designed on one machine with a certain display resolution or system font, to be displayed appropriately on another machine with a different display resolution or system font. 이 기능은 사용자 및 다른 개발자 컴퓨터 둘 다의 네이티브 Windows 및 기타 애플리케이션과 일치하도록 폼과 해당 컨트롤의 크기가 지능적으로 조정되도록 합니다.It assures that the form and its controls will intelligently resize to be consistent with native windows and other applications on both the users' and other developers' machines. 자동 크기 조정 및 비주얼 스타일에 대 한.NET Framework의 지원을 통해 일관 된 모양과 느낌을 각 사용자의 컴퓨터에서 네이티브 Windows 응용 프로그램에 비해 유지 하기 위해.NET Framework 응용 프로그램을 수 있습니다.The support of the .NET Framework for automatic scaling and visual styles enables .NET Framework applications to maintain a consistent look and feel when compared to native Windows applications on each user's machine.

대부분의 경우 2.0 이상으로 자동 크기 조정 작동 하는.NET Framework 버전에 필요합니다.For the most part, automatic scaling works as expected in .NET Framework version 2.0 and later. 그러나 글꼴 구성표 변경은 문제가 될 수 있습니다.However, font scheme changes can be problematic. 이 문제를 해결 하는 방법의 예제를 참조 하세요. 방법: Windows Forms 응용 프로그램에서 글꼴 구성표 변경에 응답합니다.For an example of how to resolve this, see How to: Respond to Font Scheme Changes in a Windows Forms Application.

자동 크기 조정 요구Need for automatic scaling

자동 크기 조정이 없으면 특정 디스플레이 해상도 또는 글꼴로 디자인된 애플리케이션이 해당 해상도나 글꼴이 변경될 경우 너무 작거나 너무 크게 나타납니다.Without automatic scaling, an application designed for one display resolution or font will either appear too small or too large when that resolution or font is changed. 예를 들어 애플리케이션이 Tahoma 9 포인트를 기준으로 디자인된 경우 조정하지 않으면 시스템 글꼴이 Tahoma 12 포인트인 컴퓨터에서 실행할 경우 너무 작게 나타납니다.For example, if the application is designed using Tahoma 9 point as a baseline, without adjustment it will appear too small if run on a machine where the system font is Tahoma 12 point. 제목, 메뉴, 텍스트 상자 내용 등의 텍스트 요소가 다른 애플리케이션보다 작게 렌더링됩니다.Text elements, such as titles, menus, text box contents, and so on will render smaller than other applications. 또한 제목 표시줄, 메뉴, 많은 컨트롤 등 텍스트가 포함된 UI(사용자 인터페이스) 요소의 크기는 사용하는 글꼴에 따라 달라집니다.Furthermore, the size of user interface (UI) elements that contain text, such as the title bar, menus, and many controls are dependent on the font used. 이 예제에서는 이러한 요소도 상대적으로 더 작게 나타납니다.In this example, these elements will also appear relatively smaller.

애플리케이션이 특정 디스플레이 해상도로 디자인된 경우 비슷한 상황이 발생합니다.An analogous situation occurs when an application is designed for a certain display resolution. 가장 일반적인 디스플레이 해상도 96dpi DPI (인치당), 100%는 디스플레이 배율을 같음는 있지만 125%, 150%, 200%를 지 원하는 더 높은 해상도 표시 (각각 같으면는 120, 144 및 192DPI) 위에 더욱 더 보편화 되 고 합니다.The most common display resolution is 96 dots per inch (DPI), which equals 100% display scaling, but higher resolution displays supporting 125%, 150%, 200% (which respectively equal 120, 144 and 192 DPI) and above are becoming more common. 조정하지 않으면 특정 해상도로 디자인된 애플리케이션, 특히 그래픽 기반 애플리케이션은 다른 해상도로 실행할 경우 너무 크거나 너무 작게 나타납니다.Without adjustment, an application, especially a graphics-based one, designed for one resolution will appear either too large or too small when run at another resolution.

자동 크기 조정은 상대 글꼴 크기나 디스플레이 해상도에 따라 폼과 해당 자식 컨트롤의 크기를 자동으로 조정하여 이러한 문제를 개선하려고 합니다.Automatic scaling seeks to ameliorate these problems by automatically resizing the form and its child controls according to the relative font size or display resolution. Windows 운영 체제는 대화 상자 단위라는 상대 측정 단위를 사용하여 대화 상자의 자동 크기 조정을 지원합니다.The Windows operating system supports automatic scaling of dialog boxes using a relative unit of measurement called dialog units. 대화 상자 단위는 시스템 글꼴을 기반으로 하며, Win32 SDK 함수 GetDialogBaseUnits를 통해 픽셀과의 해당 관계를 확인할 수 있습니다.A dialog unit is based on the system font and its relationship to pixels can be determined though the Win32 SDK function GetDialogBaseUnits. 사용자가 Windows에서 사용되는 테마를 변경하면 모든 대화 상자가 자동으로 적절하게 조정됩니다.When a user changes the theme used by Windows, all dialog boxes are automatically adjusted accordingly. 또한.NET Framework 기본 시스템 글꼴 또는 디스플레이 해상도 따라 자동 크기 조정을 지원 합니다.In addition, the .NET Framework supports automatic scaling either according to the default system font or the display resolution. 필요에 따라 애플리케이션에서 자동 크기 조정을 사용하지 않도록 설정할 수 있습니다.Optionally, automatic scaling can be disabled in an application.

자동 크기 조정에 대 한 원래 지원Original support for automatic scaling

버전 1.0 및 1.1 지원 되는.NET Framework 자동 크기 조정 Win32 SDK 값으로 표시 되는 UI에 사용 된 Windows 기본 글꼴에 종속 된 어렵지는 DEFAULT_GUI_FONT합니다.Versions 1.0 and 1.1 of the .NET Framework supported automatic scaling in a straightforward manner that was dependent on the Windows default font used for the UI, represented by the Win32 SDK value DEFAULT_GUI_FONT. 이 글꼴은 일반적으로 디스플레이 해상도가 변경되는 경우에만 변경됩니다.This font is typically only changed when the display resolution changes. 자동 크기 조정을 구현하기 위해 다음 메커니즘이 사용되었습니다.The following mechanism was used to implement automatic scaling:

  1. 디자인 타임에 AutoScaleBaseSize 속성(이제 사용 되지 않음)이 개발자 컴퓨터의 기본 시스템 글꼴 높이와 너비로 설정되었습니다.At design time, the AutoScaleBaseSize property (which is now deprecated) was set to the height and width of the default system font on the developer's machine.

  2. 런타임에 사용자 컴퓨터의 기본 시스템 글꼴이 Form 클래스의 Font 속성을 초기화하는 데 사용되었습니다.At runtime, the default system font of the user's machine was used to initialize the Font property of the Form class.

  3. 폼을 표시하기 전에 ApplyAutoScaling 메서드가 폼의 크기 조정을 위해 호출되었습니다.Before displaying the form, the ApplyAutoScaling method was called to scale the form. 이 메서드는 AutoScaleBaseSizeFont에서 상대 크기를 계산한 다음 Scale 메서드를 호출하여 실제로 폼과 자식의 크기를 조정했습니다.This method calculated the relative scale sizes from AutoScaleBaseSize and Font then called the Scale method to actually scale the form and its children.

  4. 후속 ApplyAutoScaling 호출에서 점진적으로 폼의 크기를 조정하지 않도록 AutoScaleBaseSize 값이 업데이트되었습니다.The value of AutoScaleBaseSize was updated so that subsequent calls to ApplyAutoScaling did not progressively resize the form.

이 메커니즘은 대부분의 용도에 충분했지만 다음과 같은 제한 사항이 있었습니다.While this mechanism was sufficient for most purposes, it suffered from the following limitations:

  • 이후를 AutoScaleBaseSize 속성 정수 값으로 기준 글꼴 크기를 나타내며, 반올림 오류가 분명 하 게 여러 해상도 양식을 차례로 사용할 때 발생 합니다.Since the AutoScaleBaseSize property represents the baseline font size as integer values, rounding errors occur that become evident when a form is cycled through multiple resolutions.

  • 자동 크기 조정이 Form 클래스에서만 구현되고 ContainerControl 클래스에서는 구현되지 않았습니다.Automatic scaling was implemented in only the Form class, not in the ContainerControl class. 따라서 사용자 정의 컨트롤이 폼과 동일한 해상도로 디자인되고 디자인 타임에 폼에 배치된 경우에만 제대로 크기가 조정되었습니다.As a result, user controls would scale correctly only when the user control was designed at the same resolution as the form, and it was placed in the form at design time.

  • 컴퓨터 해상도가 동일한 경우에만 여러 개발자가 동시에 폼과 해당 자식 컨트롤을 디자인할 수 있었습니다.Forms and their child controls could only be concurrently designed by multiple developers if their machine resolutions were the same. 마찬가지로, 폼의 상속이 부모 폼과 연결된 해상도에 따라 달라지도록 했습니다.Likewise it also made inheritance of a form dependent on the resolution associated with the parent form.

  • 와 같은.NET Framework 버전 2.0에 도입 된 최신 레이아웃 관리자와 호환 되지 않습니다 FlowLayoutPanelTableLayoutPanel입니다.It is not compatible with the newer layout managers introduced with the .NET Framework version 2.0, such as FlowLayoutPanel and TableLayoutPanel.

  • .NET Compact Framework에 대 한 호환성에 필요한 디스플레이 해상도 직접 기반 크기 조정을 지원 하지 않았습니다.It did not support scaling based directly on the display resolution that is required for compatibility to the .NET Compact Framework.

이 메커니즘은 이전 버전과 호환성을 유지 하기 위해.NET Framework 버전 2.0 유지 하지만 다음에 설명 하는 보다 강력한 크기 조정 메커니즘으로 대체 되었습니다.Although this mechanism is preserved in the .NET Framework version 2.0 to maintain backward compatibility, it has been superseded by the more robust scaling mechanism described next. 따라서 AutoScale, ApplyAutoScaling, AutoScaleBaseSize 및 특정 Scale 오버로드는 사용되지 않는 것으로 표시됩니다.As a consequence, the AutoScale, ApplyAutoScaling, AutoScaleBaseSize, and certain Scale overloads are marked as obsolete.

참고

레거시 코드는.NET Framework 버전 2.0으로 업그레이드할 때 이러한 멤버에 대 한 참조를 안전 하 게 삭제할 수 있습니다.You can safely delete references to these members when you upgrade your legacy code to the .NET Framework version 2.0.

자동 크기 조정에 대 한 현재 지원Current support for automatic scaling

.NET Framework 버전 2.0은 Windows Forms의 자동 크기 조정에 다음과 같이 변경을 도입 하 여 이전 제한 surmounts:The .NET Framework version 2.0 surmounts previous limitations by introducing the following changes to the automatic scaling of Windows Forms:

  • 폼, 네이티브 복합 컨트롤 및 사용자 정의 컨트롤이 모두 균일한 크기 조정 지원을 받을 수 있도록 크기 조정에 대한 기본 지원이 ContainerControl 클래스로 이동되었습니다.Base support for scaling has been moved to the ContainerControl class so that forms, native composite controls and user controls all receive uniform scaling support. 새 멤버 AutoScaleFactor, AutoScaleDimensions, AutoScaleModePerformAutoScale이 추가되었습니다.The new members AutoScaleFactor, AutoScaleDimensions, AutoScaleMode and PerformAutoScale have been added.

  • Control 클래스에는 크기 조정에 참여하고 동일한 폼에서 혼합된 크기 조정을 지원할 수 있게 해주는 여러 개의 새 멤버도 있습니다.The Control class also has several new members that allow it to participate in scaling and to support mixed scaling on the same form. 구체적으로 Scale, ScaleChildrenGetScaledBounds 멤버가 크기 조정을 지원합니다.Specifically the Scale, ScaleChildren, and GetScaledBounds members support scaling.

  • AutoScaleMode 열거형에서 정의된 시스템 글꼴 지원을 보완하기 위해 화면 해상도를 기반으로 하는 크기 조정 지원이 추가되었습니다.Support for scaling based upon the screen resolution has been added to complement system font support, as defined by the AutoScaleMode enumeration. 이 모드는 응용 프로그램을 쉽게 마이그레이션할을 사용 하도록 설정 하는.NET Compact Framework에서 지 원하는 자동 크기 조정과 호환입니다.This mode is compatible with automatic scaling supported by the .NET Compact Framework enabling easier application migration.

  • FlowLayoutPanelTableLayoutPanel과 같은 레이아웃 관리자와의 호환성이 자동 크기 조정 구현에 추가되었습니다.Compatibility with layout managers such as FlowLayoutPanel and TableLayoutPanel has been added to the implementation of automatic scaling.

  • 이제 배율 인수가 일반적으로 SizeF 구조체를 사용하여 부동 소수점 값으로 표시되므로 반올림 오류가 거의 제거되었습니다.Scaling factors are now represented as floating point values, typically using the SizeF structure, so that rounding errors have been practically eliminated.

주의

DPI 및 글꼴 크기 조정 모드의 임의 혼합은 지원되지 않습니다.Arbitrary mixtures of DPI and font scaling modes are not supported. 특정 모드(예: DPI)를 사용하여 사용자 정의 컨트롤의 크기를 조정하고 다른 모드(글꼴)를 사용하여 폼에 배치하는 것은 아무 문제가 없지만 특정 모드의 기본 폼과 다른 모드의 파생 폼을 혼합하면 예기치 않은 결과가 발생할 수 있습니다.Although you may scale a user control using one mode (for example, DPI) and place it on a form using another mode (Font) with no issues, but mixing a base form in one mode and a derived form in another can lead to unexpected results.

작업의 자동 크기 조정Automatic scaling in action

이제 Windows Forms에서 다음 논리를 사용하여 폼과 해당 내용의 크기를 자동으로 조정합니다.Windows Forms now uses the following logic to automatically scale forms and their contents:

  1. 디자인 타임에 각 ContainerControl이 크기 조정 모드와 현재 해상도를 AutoScaleModeAutoScaleDimensions에 각각 기록합니다.At design time, each ContainerControl records the scaling mode and it current resolution in the AutoScaleMode and AutoScaleDimensions, respectively.

  2. 런타임에 실제 해상도가 CurrentAutoScaleDimensions 속성에 저장됩니다.At run time, the actual resolution is stored in the CurrentAutoScaleDimensions property. AutoScaleFactor 속성이 런타임 및 디자인 타임 크기 조정 해상도 간의 비율을 동적으로 계산합니다.The AutoScaleFactor property dynamically calculates the ratio between the run-time and design-time scaling resolution.

  3. 폼이 로드될 때 CurrentAutoScaleDimensionsAutoScaleDimensions의 값이 서로 다르면 PerformAutoScale 메서드가 호출되어 컨트롤 및 해당 자식의 크기를 조정합니다.When the form loads, if the values of CurrentAutoScaleDimensions and AutoScaleDimensions are different, then the PerformAutoScale method is called to scale the control and its children. 이 메서드는 레이아웃을 일시 중단하고 Scale 메서드를 호출하여 실제 크기 조정을 수행합니다.This method suspends layout and calls the Scale method to perform the actual scaling. 그 후에 AutoScaleDimensions 값이 업데이트되어 점진적 크기 조정을 방지합니다.Afterwards, the value of AutoScaleDimensions is updated to avoid progressive scaling.

  4. 다음 상황에서는 PerformAutoScale도 자동으로 호출됩니다.PerformAutoScale is also automatically invoked in the following situations:

    • 크기 조정 모드가 Font인 경우 OnFontChanged 이벤트에 대한 응답으로In response to the OnFontChanged event if the scaling mode is Font.

    • 컨테이너 컨트롤의 레이아웃이 다시 시작되고 AutoScaleDimensions 또는 AutoScaleMode 속성에서 변경 내용이 검색되는 경우When the layout of the container control resumes and a change is detected in the AutoScaleDimensions or AutoScaleMode properties.

    • 위에서 암시한 대로 부모 ContainerControl의 크기가 조정되는 경우As implied above, when a parent ContainerControl is being scaled. 각 컨테이너 컨트롤은 부모 컨테이너의 배율 인수가 아니라 고유한 배율 인수를 사용하여 자식의 크기를 조정해야 합니다.Each container control is responsible for scaling its children using its own scaling factors and not the one from its parent container.

  5. 자식 컨트롤은 다음과 같은 여러 수단을 통해 해당 크기 조정 동작을 수정할 수 있습니다.Child controls can modify their scaling behavior through several means:

    • ScaleChildren 속성을 재정의하여 해당 자식 컨트롤의 크기를 조정할지 여부를 결정할 수 있습니다.The ScaleChildren property can be overridden to determine if their child controls should be scaled or not.

    • GetScaledBounds 메서드를 재정의하여 컨트롤의 크기가 조정되는 범위를 조정할 수 있지만 크기 조정 논리는 조정할 수 없습니다.The GetScaledBounds method can be overridden to adjust the bounds that the control is scaled to, but not the scaling logic.

    • ScaleControl 메서드를 재정의하여 현재 컨트롤에 대한 크기 조정 논리를 변경할 수 있습니다.The ScaleControl method can be overridden to change the scaling logic for the current control.

참고자료See also