C# 프로그램 윈도우별 레이아웃 틀어짐

처음 C#으로 프로그램을 만들었는데 윈도우 10 64bit에서 실행시키면 만들었을때랑
딱 맞게 되는데 윈도우 7 32bit에서 실행시키면 버튼이나 리스트뷰의 크기가 바뀌어서 일부 버튼이 아예 화면밖으로 나가버리네요…
모니터나 해상도는 동일한데 해결할 방법이 있을까요?


2 Likes

발생 원인

해당 문제는 Form 인스턴스의 AutoScaleMode 속성이 Font 로 설정되어 발생하는 문제입니다.

프로그램이 구동되는 운영체제에 설정 된 기본 폰트의 특성에 따라 폼 내 컨트롤의 레이아웃을 자동으로 조정해주는 기능인데 WinForms 개발에서 많이 발생하는 문제입니다.

아래 예시는 영문 윈도우와 한글 윈도우의 기본 폰트 차이 입니다.

한글 Windows XP의 기본 폰트 - 굴림 9포인트

영문 Windows XP의 기본 폰트 - Tahoma 8포인트

영문 폰트와 한글 폰트의 경우만 봐도 가로/세로 비율이 차이가 납니다. 이렇게 시스템 폰트를 사용자가 지정할 수 있기 때문에 설정한 폰트에 따라 비율과 크기를 자동으로 보정해 주는데 이 기능이 완벽하게 동작하지 않기 때문이죠.

보통 이 문제는 화면 구성 시 창 크기의 리사이즈를 고려하여 Anchor 속성을 적절히 지정해줬다면 특별한 문제가 없지만 Anchor를 지정하지 않고 기본 값인 Left, Top로 지정된 상태로 레이아웃으로 구성할 경우 흔히 발생합니다.

해결책

현재 해상도가 고정된 환경이라면 일단 AutoScaleModeNone으로 설정해 보시기 바랍니다.

모든 컨트롤도 해당 속성을 가지고 있는데요, 일반적으로 부모 Form의 값을 사용하도록 하는 Inherit으로 설정되어 있어 부모 Form의 값만 변경하면 되지만 종종 하위 컨트롤이나 컨테이너의 해당 속성 값이 Font로 설정되어 있는 경우도 있습니다.

디자이너 코드에서 AutoScaleMode 속성을 지정하고 있는 모든 컨트롤을 None으로 변경한 뒤 기준을 삼으시면 다른 환경에서도 잘 보이게 될겁니다.

그리고 디자이너 속성창에서 해당 옵션을 수정할 경우 원치 않게 기존 컨트롤의 레이아웃이 변경되는 경우도 있습니다. 이때는 디자이너 코드에서 수동으로 this.AutoScaleDimensions = ... 부분을 모두 삭제하시고 바로 아래에 있는 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font 부분을 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None으로 수정해 보시기 바랍니다.

13 Likes

윈도우 글자크기에따라 깨져서 고민이었는데 이게 문제였군요 감사합니다

2 Likes

문제를 좀 더 원천적으로 해결하기 원하신다면, TableLayoutPanel 같은 레이아웃 렌더링 도구로 마이그레이션이 가능한지를 보시는 것이 도움이 됩니다. 오토 스케일링이 모든 경우에 있어서 정확히 동작하지는 못하기 때문에 이런 전문화된 레이아웃 컨트롤을 쓰는 것이 도움이 될 수 있습니다.

1 Like