처음 C#으로 프로그램을 만들었는데 윈도우 10 64bit에서 실행시키면 만들었을때랑
딱 맞게 되는데 윈도우 7 32bit에서 실행시키면 버튼이나 리스트뷰의 크기가 바뀌어서 일부 버튼이 아예 화면밖으로 나가버리네요…
모니터나 해상도는 동일한데 해결할 방법이 있을까요?
발생 원인
해당 문제는 Form
인스턴스의 AutoScaleMode
속성이 Font
로 설정되어 발생하는 문제입니다.
프로그램이 구동되는 운영체제에 설정 된 기본 폰트의 특성에 따라 폼 내 컨트롤의 레이아웃을 자동으로 조정해주는 기능인데 WinForms 개발에서 많이 발생하는 문제입니다.
아래 예시는 영문 윈도우와 한글 윈도우의 기본 폰트 차이 입니다.
한글 Windows XP의 기본 폰트 - 굴림
9포인트
영문 Windows XP의 기본 폰트 - Tahoma
8포인트
영문 폰트와 한글 폰트의 경우만 봐도 가로/세로 비율이 차이가 납니다. 이렇게 시스템 폰트를 사용자가 지정할 수 있기 때문에 설정한 폰트에 따라 비율과 크기를 자동으로 보정해 주는데 이 기능이 완벽하게 동작하지 않기 때문이죠.
보통 이 문제는 화면 구성 시 창 크기의 리사이즈를 고려하여 Anchor
속성을 적절히 지정해줬다면 특별한 문제가 없지만 Anchor
를 지정하지 않고 기본 값인 Left, Top
로 지정된 상태로 레이아웃으로 구성할 경우 흔히 발생합니다.
해결책
현재 해상도가 고정된 환경이라면 일단 AutoScaleMode
를 None
으로 설정해 보시기 바랍니다.
모든 컨트롤도 해당 속성을 가지고 있는데요, 일반적으로 부모 Form
의 값을 사용하도록 하는 Inherit
으로 설정되어 있어 부모 Form
의 값만 변경하면 되지만 종종 하위 컨트롤이나 컨테이너의 해당 속성 값이 Font
로 설정되어 있는 경우도 있습니다.
디자이너 코드에서 AutoScaleMode
속성을 지정하고 있는 모든 컨트롤을 None
으로 변경한 뒤 기준을 삼으시면 다른 환경에서도 잘 보이게 될겁니다.
그리고 디자이너 속성창에서 해당 옵션을 수정할 경우 원치 않게 기존 컨트롤의 레이아웃이 변경되는 경우도 있습니다. 이때는 디자이너 코드에서 수동으로 this.AutoScaleDimensions = ...
부분을 모두 삭제하시고 바로 아래에 있는 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
부분을 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None
으로 수정해 보시기 바랍니다.
윈도우 글자크기에따라 깨져서 고민이었는데 이게 문제였군요 감사합니다
문제를 좀 더 원천적으로 해결하기 원하신다면, TableLayoutPanel 같은 레이아웃 렌더링 도구로 마이그레이션이 가능한지를 보시는 것이 도움이 됩니다. 오토 스케일링이 모든 경우에 있어서 정확히 동작하지는 못하기 때문에 이런 전문화된 레이아웃 컨트롤을 쓰는 것이 도움이 될 수 있습니다.