Windows Forms의 자동 배율 조정
자동 배율 조정 기능을 사용하면 한 컴퓨터에서 특정 해상도 또는 시스템 글꼴로 표시되도록 설계된 폼과 그 컨트롤을 다른 컴퓨터에서 다른 해상도 또는 시스템 글꼴로 표시할 수 있습니다. 이 기능은 폼과 그 컨트롤의 크기를 사용자 컴퓨터와 다른 개발자 컴퓨터에서 네이티브 Windows 및 기타 응용 프로그램에 맞게 자동으로 조정합니다. .NET Framework의 자동 배율 조정 및 비주얼 스타일 기능을 통해 각 사용자의 컴퓨터에서 .NET Framework 응용 프로그램의 모양과 느낌을 네이티브 Windows 응용 프로그램과 일관되게 유지할 수 있습니다.
자동 배율 조정의 필요성
자동 배율 조정 기능을 사용하지 않으면 한 가지 해상도 또는 글꼴용으로 설계된 응용 프로그램의 경우 해상도나 글꼴이 변경될 때 너무 작거나 너무 크게 표시됩니다. 예를 들어, Tahoma 9포인트를 기준선으로 사용하도록 설계된 응용 프로그램을 시스템 글꼴이 Tahoma 12포인트인 컴퓨터에서 조정을 하지 않고 실행하면 이 응용 프로그램이 너무 작게 표시됩니다. 제목, 메뉴, 텍스트 상자 내용 등의 텍스트 요소는 다른 응용 프로그램에 비해 작게 렌더링됩니다. 뿐만 아니라 제목 표시줄과 같은 텍스트를 포함하는 UI(사용자 인터페이스) 요소, 메뉴 및 여러 컨트롤의 크기는 사용되는 글꼴에 따라 결정됩니다. 이 예제에서는 이러한 요소도 상대적으로 작게 표시됩니다.
응용 프로그램이 특정 해상도용으로 설계된 경우에도 비슷한 상황이 발생합니다. 가장 일반적인 해상도는 96dpi이지만 120, 133, 170 및 그 이상을 지원하는 고해상도가 점차 많이 사용되고 있습니다. 한 가지 해상도용로 설계된 응용 프로그램, 특히 그래픽 기반 응용 프로그램을 다른 해상도에서 조정 없이 실행하면 너무 작거나 너무 크게 표시됩니다.
자동 배율 조정 기능은 상대적인 글꼴 크기 또는 해상도에 따라 폼과 그 자식 컨트롤의 크기를 자동으로 조정하여 이러한 문제를 해결합니다. Windows 운영 체제에서는 대화 상자 단위라고 하는 상대적인 측정 단위를 사용하여 대화 상자의 자동 배율 조정을 지원합니다. 대화 상자 단위는 시스템 글꼴을 기준으로 하며 픽셀과의 관계는 Win32 SDK 함수인 GetDialogBaseUnits를 통해 확인할 수 있습니다. 사용자가 Windows에서 사용되는 테마를 변경하면 모든 대화 상자도 그에 따라 자동으로 조정됩니다. 또한
.NET Framework에서는 기본 시스템 글꼴 또는 해상도에 따라 자동 배율 조정을 지원합니다. 필요에 따라 응용 프로그램에서 자동 배율 조정을 비활성화할 수 있습니다.
이전의 자동 배율 조정 지원
.NET Framework 버전 1.0 및 1.1에서는 Win32 SDK 값 DEFAULT_GUI_FONT가 나타내는 Windows의 기본 UI 글꼴에 의존하던 직접적인 방식으로 자동 배율 조정을 지원했습니다. 이 글꼴은 일반적으로 해상도가 바뀌는 경우에만 변경됩니다. 자동 배율 조정은 다음과 같은 메커니즘을 통해 구현되었습니다.
디자인 타임에는 AutoScaleBaseSize 속성(더 이상 사용되지 않음)이 개발자 컴퓨터의 기본 시스템 글꼴의 높이와 너비로 설정됩니다.
폼을 표시하기 전에 ApplyAutoScaling 메서드가 호출되어 폼의 배율을 조정합니다. 이 메서드는 AutoScaleBaseSize 및 Font를 사용하여 상대 배율 크기를 계산한 다음 Scale 메서드를 호출하여 폼과 그 자식 항목의 실제 크기를 조정합니다.
이후의 ApplyAutoScaling 호출에 의해 점차적으로 폼의 크기가 변경되지 않도록 AutoScaleBaseSize 값이 업데이트됩니다.
대부분의 경우 이 메커니즘만으로도 충분하지만 이 메커니즘에는 다음과 같은 제한이 있습니다.
AutoScaleBaseSize 속성은 기준선 글꼴 크기를 정수 계열 값으로 나타내므로 폼의 해상도가 여러 차례 변경될 경우 명백한 반올림 오류가 발생합니다.
자동 배율 조정이 Form 클래스에서만 구현되고 ContainerControl 클래스에서는 구현되지 않았습니다. 따라서 폼과 같은 해상도로 설계되고 디자인 타임에 폼에 배치된 사용자 정의 컨트롤의 배율만 올바르게 조정되었습니다.
폼과 그 자식 컨트롤을 여러 개발자가 동시에 설계하려면 각 개발자의 컴퓨터 해상도가 같아야 했습니다. 마찬가지로 폼에는 부모 폼에 연결된 해상도가 상속되었습니다.
이 메커니즘은 .NET Framework 버전 2.0의 FlowLayoutPanel 및 TableLayoutPanel과 같은 새 레이아웃 관리자와 호환되지 않습니다.
이 메커니즘은 .NET Compact Framework와의 호환성을 위해 필요한 해상도를 직접 기반으로 하는 배율 조정 기능을 지원하지 않습니다.
이 메커니즘은 이전 버전과의 호환성을 위해 .NET Framework 버전 2.0에서 유지되기는 하지만 다음에 설명하는 보다 강력한 배율 조정 메커니즘으로 대체되었습니다. 결과적으로 AutoScale, ApplyAutoScaling, AutoScaleBaseSize 및 특정 Scale 오버로드는 더 이상 사용되지 않는 것으로 표시됩니다.
참고
레거시 코드를 .NET Framework 버전 2.0으로 업그레이드할 때 이러한 멤버에 대한 참조를 삭제해도 아무런 문제가 없습니다.
현재의 자동 배율 조정 지원
.NET Framework 버전 2.0에서는 Windows Forms의 자동 배율 조정 기능을 다음과 같이 변경하여 이전의 제한 사항을 해결했습니다.
ContainerControl 클래스에서 기본 배율 조정 기능을 지원함으로써 폼, 네이티브 복합 컨트롤 및 사용자 정의 컨트롤 모두 동일한 배율 조정 기능을 사용할 수 있습니다. AutoScaleFactor, AutoScaleDimensions, AutoScaleMode, PerformAutoScale 등의 새로운 멤버가 추가되었습니다.
또한 Control 클래스의 몇 가지 새 멤버를 사용하면 배율 조정에 참여하고 같은 폼에서 혼합 배율 조정을 지원할 수 있습니다. 구체적으로 Scale, ScaleChildren 및 GetScaledBounds 멤버를 배율 조정에 사용할 수 있습니다.
AutoScaleMode 열거형에서 정의한 대로 화면 해상도를 기반으로 하는 배율 조정 지원이 추가되어 시스템 글꼴 지원을 보완합니다. 이 모드는 응용 프로그램을 쉽게 마이그레이션할 수 있도록 .NET Compact Framework에서 지원하는 자동 배율 조정과 호환됩니다.
FlowLayoutPanel 및 TableLayoutPanel과 같은 레이아웃 관리자와의 호환성이 자동 배율 조정 구현에 추가되었습니다.
배율 인수는 이제 일반적으로 SizeF 구조체를 사용하여 부동 소수점 값으로 나타내므로 반올림 오류가 크게 줄었습니다.
경고
DPI 및 글꼴 배율 조정 모드의 임의 혼합은 지원되지 않습니다. 한 가지 모드(예: DPI)를 사용하여 사용자 정의 컨트롤의 배율을 조정한 다음 다른 모드(예: 글꼴)를 사용하여 컨트롤을 폼에 배치할 수는 있지만 한 모드의 기본 폼과 다른 모드의 파생 폼을 함께 사용할 경우에는 예기치 못한 결과가 발생할 수 있습니다.
사용 중인 자동 배율 조정
Windows Forms에서는 현재 다음과 같은 논리를 사용하여 폼과 그 내용의 배율을 자동으로 조정합니다.
디자인 타임에는 각 ContainerControl이 배율 조정 모드와 현재 해상도를 각각 AutoScaleMode 및 AutoScaleDimensions에 기록합니다.
런타임에는 실제 해상도가 CurrentAutoScaleDimensions 속성에 저장됩니다. AutoScaleFactor 속성은 런타임 배율 조정 해상도와 디자인 타임 배율 조정 해상도의 비율을 동적으로 계산합니다.
폼이 로드될 때 CurrentAutoScaleDimensions 값과 AutoScaleDimensions 값이 다르면 PerformAutoScale 메서드가 호출되어 컨트롤과 그 자식 컨트롤의 배율이 조정됩니다. 이 메서드는 레이아웃을 일시 중단시킨 다음 Scale 메서드를 호출하여 실제 배율 조정을 수행합니다. 그런 다음 점차적 배율 조정이 수행되지 않도록 AutoScaleDimensions 값이 업데이트됩니다.
다음과 같은 상황에서도 PerformAutoScale이 자동으로 호출됩니다.
배율 조정 모드가 Font인 경우 OnFontChanged 이벤트에 대한 응답으로 호출됩니다.
컨테이너 컨트롤의 레이아웃이 다시 시작되고 AutoScaleDimensions 또는 AutoScaleMode 속성이 변경된 경우에 호출됩니다.
위에서 암시된 대로 부모 ContainerControl이 배율 조정되는 경우에 호출됩니다. 각 컨테이너 컨트롤은 부모 컨테이너의 배율 인수가 아닌 자식 컨트롤의 자체 배율 인수를 사용하여 자식 컨트롤의 배율을 조정합니다.
자식 컨트롤에서는 다음과 같은 방법을 통해 해당 배율 조정 동작을 수정할 수 있습니다.
ScaleChildren 속성을 재정의하여 자식 컨트롤의 배율을 조정해야 하는지 여부를 확인할 수 있습니다.
GetScaledBounds 메서드를 재정의하여 배율 조정 논리가 아닌 컨트롤의 배율 조정 범위를 조정할 수 있습니다.
ScaleControl 메서드를 재정의하여 현재 컨트롤의 배율 조정 논리를 변경할 수 있습니다.