자동 스케일링(Windows Forms .NET)

자동 스케일링은 한 머신에서 특정 디스플레이 해상도 또는 글꼴로 디자인된 양식과 해당 컨트롤이 다른 디스플레이 해상도 또는 글꼴을 사용하는 다른 머신에서 제대로 표시될 수 있게 합니다. 이 기능은 사용자 및 다른 개발자 컴퓨터 둘 다의 네이티브 Windows 및 기타 애플리케이션과 일치하도록 폼과 해당 컨트롤의 크기가 지능적으로 조정되도록 합니다. 자동 스케일링 및 시각적 스타일을 통해 Windows Forms 애플리케이션은 각 사용자 머신의 네이티브 Windows 애플리케이션과 비교하여 일관된 모양과 느낌을 유지할 수 있습니다.

대부분의 경우 자동 스케일링은 Windows Forms에서 예상대로 작동합니다. 그러나 글꼴 구성표 변경은 문제가 될 수 있습니다.

중요

.NET 7 및 .NET 6에 관한 데스크톱 가이드 설명서는 제작 중입니다.

자동 스케일링 요구

자동 크기 조정이 없으면 특정 디스플레이 해상도 또는 글꼴로 디자인된 애플리케이션이 해당 해상도나 글꼴이 변경될 경우 너무 작거나 너무 크게 나타납니다. 예를 들어 애플리케이션이 Tahoma 9 포인트를 기준으로 디자인된 경우 조정하지 않으면 시스템 글꼴이 Tahoma 12 포인트인 컴퓨터에서 실행할 경우 너무 작게 나타납니다. 제목, 메뉴, 텍스트 상자 내용 등의 텍스트 요소가 다른 애플리케이션보다 작게 렌더링됩니다. 또한 제목 표시줄, 메뉴, 많은 컨트롤 등 텍스트가 포함된 UI(사용자 인터페이스) 요소의 크기는 사용하는 글꼴에 따라 달라집니다. 이 예제에서는 이러한 요소도 상대적으로 더 작게 나타납니다.

애플리케이션이 특정 디스플레이 해상도로 디자인된 경우 비슷한 상황이 발생합니다. 가장 일반적인 디스플레이 해상도는 100% 디스플레이 스케일링인 96DPI지만 125%, 150%, 200%(각각 120, 144, 192DPI) 이상을 지원하는 높은 해상도 디스플레이가 점점 더 일반화되고 있습니다. 조정하지 않으면 특정 해상도로 디자인된 애플리케이션, 특히 그래픽 기반 애플리케이션은 다른 해상도로 실행할 경우 너무 크거나 너무 작게 나타납니다.

자동 스케일링은 상대 글꼴 크기나 디스플레이 해상도에 따라 양식과 자식 컨트롤의 크기를 자동으로 조정하여 해당 문제를 해결하려고 합니다. Windows 운영 체제는 대화 상자 단위라는 상대 측정 단위를 사용하여 대화 상자의 자동 크기 조정을 지원합니다. 대화 상자 단위는 시스템 글꼴을 기반으로 하며, Win32 SDK 함수 GetDialogBaseUnits를 통해 픽셀과의 해당 관계를 확인할 수 있습니다. 사용자가 Windows에서 사용되는 테마를 변경하면 모든 대화 상자가 자동으로 적절하게 조정됩니다. 또한 Windows Forms에서는 기본 시스템 글꼴 또는 디스플레이 해상도에 따라 자동 스케일링을 지원합니다. 필요에 따라 애플리케이션에서 자동 크기 조정을 사용하지 않도록 설정할 수 있습니다.

주의

DPI 및 글꼴 크기 조정 모드의 임의 혼합은 지원되지 않습니다. 특정 모드(예: DPI)를 사용하여 사용자 정의 컨트롤의 크기를 조정하고 다른 모드(글꼴)를 사용하여 폼에 배치하는 것은 아무 문제가 없지만 특정 모드의 기본 폼과 다른 모드의 파생 폼을 혼합하면 예기치 않은 결과가 발생할 수 있습니다.

자동 스케일링의 실제 동작

Windows Forms는 다음 논리를 사용하여 양식과 해당 콘텐츠를 자동으로 스케일링합니다.

  1. 디자인 타임에 각 ContainerControl이 크기 조정 모드와 현재 해상도를 AutoScaleModeAutoScaleDimensions에 각각 기록합니다.

  2. 런타임에 실제 해상도가 CurrentAutoScaleDimensions 속성에 저장됩니다. AutoScaleFactor 속성이 런타임 및 디자인 타임 크기 조정 해상도 간의 비율을 동적으로 계산합니다.

  3. 폼이 로드될 때 CurrentAutoScaleDimensionsAutoScaleDimensions의 값이 서로 다르면 PerformAutoScale 메서드가 호출되어 컨트롤 및 해당 자식의 크기를 조정합니다. 이 메서드는 레이아웃을 일시 중단하고 Scale 메서드를 호출하여 실제 크기 조정을 수행합니다. 그 후에 AutoScaleDimensions 값이 업데이트되어 점진적 크기 조정을 방지합니다.

  4. 다음 상황에서는 PerformAutoScale도 자동으로 호출됩니다.

    • 크기 조정 모드가 Font인 경우 OnFontChanged 이벤트에 대한 응답으로

    • 컨테이너 컨트롤의 레이아웃이 다시 시작되고 AutoScaleDimensions 또는 AutoScaleMode 속성에서 변경 내용이 검색되는 경우

    • 위에서 암시한 대로 부모 ContainerControl의 크기가 조정되는 경우 각 컨테이너 컨트롤은 부모 컨테이너의 배율 인수가 아니라 고유한 배율 인수를 사용하여 자식의 크기를 조정해야 합니다.

  5. 자식 컨트롤은 다음과 같은 여러 수단을 통해 해당 크기 조정 동작을 수정할 수 있습니다.

    • ScaleChildren 속성을 재정의하여 해당 자식 컨트롤의 크기를 조정할지 여부를 결정할 수 있습니다.

    • GetScaledBounds 메서드를 재정의하여 컨트롤의 크기가 조정되는 범위를 조정할 수 있지만 크기 조정 논리는 조정할 수 없습니다.

    • ScaleControl 메서드를 재정의하여 현재 컨트롤에 대한 크기 조정 논리를 변경할 수 있습니다.

참고 항목