Windows Forms의 자동 크기 조정
자동 크기 조정은 한 컴퓨터에서 특정 디스플레이 해상도 또는 시스템 글꼴로 디자인된 폼과 해당 컨트롤이 다른 디스플레이 해상도 또는 시스템 글꼴을 사용하는 다른 컴퓨터에서 제대로 표시될 수 있게 합니다. 이 기능은 사용자 및 다른 개발자 컴퓨터 둘 다의 네이티브 Windows 및 기타 애플리케이션과 일치하도록 폼과 해당 컨트롤의 크기가 지능적으로 조정되도록 합니다. 자동 스케일링 및 시각적 스타일에 대한 .NET Framework의 지원을 통해 .NET Framework 애플리케이션은 각 사용자 컴퓨터의 네이티브 Windows 애플리케이션과 비교하여 일관된 모양과 느낌을 유지 관리할 수 있습니다.
대부분의 경우, 자동 스케일링은 .NET Framework 버전 2.0 이상에서 예상대로 작동합니다. 그러나 글꼴 구성표 변경은 문제가 될 수 있습니다. 이 문제를 해결하는 방법의 예는 방법: Windows Forms 애플리케이션에서 글꼴 구성표 변경에 대응하기를 참조하세요.
자동 스케일링 요구
자동 크기 조정이 없으면 특정 디스플레이 해상도 또는 글꼴로 디자인된 애플리케이션이 해당 해상도나 글꼴이 변경될 경우 너무 작거나 너무 크게 나타납니다. 예를 들어 애플리케이션이 Tahoma 9 포인트를 기준으로 디자인된 경우 조정하지 않으면 시스템 글꼴이 Tahoma 12 포인트인 컴퓨터에서 실행할 경우 너무 작게 나타납니다. 제목, 메뉴, 텍스트 상자 내용 등의 텍스트 요소가 다른 애플리케이션보다 작게 렌더링됩니다. 또한 제목 표시줄, 메뉴, 많은 컨트롤 등 텍스트가 포함된 UI(사용자 인터페이스) 요소의 크기는 사용하는 글꼴에 따라 달라집니다. 이 예제에서는 이러한 요소도 상대적으로 더 작게 나타납니다.
애플리케이션이 특정 디스플레이 해상도로 디자인된 경우 비슷한 상황이 발생합니다. 가장 일반적인 디스플레이 해상도는 100% 디스플레이 스케일링인 96DPI지만 125%, 150%, 200%(각각 120, 144, 192DPI) 이상을 지원하는 높은 해상도 디스플레이가 점점 더 일반화되고 있습니다. 조정하지 않으면 특정 해상도로 디자인된 애플리케이션, 특히 그래픽 기반 애플리케이션은 다른 해상도로 실행할 경우 너무 크거나 너무 작게 나타납니다.
자동 크기 조정은 상대 글꼴 크기나 디스플레이 해상도에 따라 폼과 해당 자식 컨트롤의 크기를 자동으로 조정하여 이러한 문제를 개선하려고 합니다. Windows 운영 체제는 대화 상자 단위라는 상대 측정 단위를 사용하여 대화 상자의 자동 크기 조정을 지원합니다. 대화 상자 단위는 시스템 글꼴을 기반으로 하며, Win32 SDK 함수 GetDialogBaseUnits
를 통해 픽셀과의 해당 관계를 확인할 수 있습니다. 사용자가 Windows에서 사용되는 테마를 변경하면 모든 대화 상자가 자동으로 적절하게 조정됩니다. 또한 .NET Framework에서는 기본 시스템 글꼴 또는 디스플레이 해상도에 따라 자동 스케일링을 지원합니다. 필요에 따라 애플리케이션에서 자동 크기 조정을 사용하지 않도록 설정할 수 있습니다.
자동 스케일링에 대한 원래 지원
.NET Framework의 버전 1.0 및 1.1에서는 Win32 SDK 값 DEFAULT_GUI_FONT로 표현되는 UI에 사용된 Windows 기본 글꼴에 따라 달라지는 간단한 방법으로 자동 스케일링을 지원했습니다. 이 글꼴은 일반적으로 디스플레이 해상도가 변경되는 경우에만 변경됩니다. 자동 크기 조정을 구현하기 위해 다음 메커니즘이 사용되었습니다.
디자인 타임에 AutoScaleBaseSize 속성(이제 사용 되지 않음)이 개발자 컴퓨터의 기본 시스템 글꼴 높이와 너비로 설정되었습니다.
런타임에 사용자 컴퓨터의 기본 시스템 글꼴이 Form 클래스의 Font 속성을 초기화하는 데 사용되었습니다.
폼을 표시하기 전에 ApplyAutoScaling 메서드가 폼의 크기 조정을 위해 호출되었습니다. 이 메서드는 AutoScaleBaseSize 및 Font에서 상대 크기를 계산한 다음 Scale 메서드를 호출하여 실제로 폼과 자식의 크기를 조정했습니다.
후속 ApplyAutoScaling 호출에서 점진적으로 폼의 크기를 조정하지 않도록 AutoScaleBaseSize 값이 업데이트되었습니다.
이 메커니즘은 대부분의 용도에 충분했지만 다음과 같은 제한 사항이 있었습니다.
AutoScaleBaseSize 속성이 기준 글꼴 크기를 정수 값으로 나타내기 때문에 여러 해상도에서 차례로 폼을 사용할 때 명확하게 드러나는 반올림 오류가 발생합니다.
자동 크기 조정이 Form 클래스에서만 구현되고 ContainerControl 클래스에서는 구현되지 않았습니다. 따라서 사용자 정의 컨트롤이 폼과 동일한 해상도로 디자인되고 디자인 타임에 폼에 배치된 경우에만 제대로 크기가 조정되었습니다.
컴퓨터 해상도가 동일한 경우에만 여러 개발자가 동시에 폼과 해당 자식 컨트롤을 디자인할 수 있었습니다. 마찬가지로, 폼의 상속이 부모 폼과 연결된 해상도에 따라 달라지도록 했습니다.
이것은 FlowLayoutPanel 및 TableLayoutPanel과 같은 .NET Framework 버전 2.0에서 소개된 최신 레이아웃 관리자와 호환되지 않습니다.
이것은 .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 메서드를 재정의하여 현재 컨트롤에 대한 크기 조정 논리를 변경할 수 있습니다.
참고 항목
.NET Desktop feedback