[VisualStudio] 문제해결 - MacBook 등의 높은 DPI 머신에서 Winform 디자인 화면 깨짐

291

오류 - 높은 DPI 머신에서 Visual Studio 의 WindowForms 디자인 화면 깨짐.

Visual Studio 를 사용해서 생성한 WindowForms 화면 디자인을 MacBook 이나 Surface 등과 같은 해상도가 높은 (DPI 가 높은) 머신에서는 열면 디자인 화면이 깨져 보인다.

오류 증상

대 부분은 Label, GroupBox 등의 컨트롤의 크기가 깨지면서 텍스트나 크기 등의 아주 다양한 부분에 디자인의 크기가 자연스럽게 처리되지 못하고 깨지는 상황이 발생한다.

오류 원인

Visual Studio 2015, 2017 은 DPI 인식을 하는 어플리케이션이기 때문에 이런 문제가 생긴다. 이전 버전은 현재 테스트를 해보지 않았기 때문에 확정할 수는 없지만, 아마도 DPI 인식이 없다면 문제가 없을 것으로 유추된다.

문제는 DPI 인식을 통해서 "디스플레이 배율 조정" 기능이 제대로 동작하면 다행인데 이 기능이 제대로 동작하지 못해서 발생한다.

따라서 어떤 경우는 적용되고, 어떤 경우는 적용되지 못하기 떄문에 Container 는 줄었는데 내부 내용은 처리되지 못하는 등의 문제가 생겨서 화면서 깨진 것처럼 표시되는 것이다.

해결 방법

DPI 인식 어플리케이션에 디스플레이 스케일링을 활성화 또는 비활성화하는 방법은 아래와 같다.

  • *.exe 파일 속성의 호환 탭의 “높은 DPI 설정 변경” 을 통한 조정
  • *.exe.manifest 파일에서 설정 변경
  • 실행할 때 Win32 API 인 “SetProcessDPIAware()” 함수 호출

그런데 문제는 Visual Studio 의 경우는 dev.exe 의 속성에 호환성 탭이 없고, devenv.exe.manifest 파일이 실행파일에 포함되어 있기 때문에 이를 재정의할 수 없다는 점이다.

따라서 이 문제를 해결하기 위해서는 Registry 설정을 통해서 어플리케이션에 대한 DPI 인식을 꺼버리는 수 밖에는 없어 보인다.

1
2
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\devenv.exe]
"dpiAwareness"= dword : 00000000

실제 Registry 키로 이동해 보면 devenv.exe 는 등록되어 있지 않다. 따라서 왼쪽 레지스트리 트리뷰에서 "devenv.exe" 이름으로 키를 생성해 줘야 한다.

그리고 오른쪽 속성 창에서 "DWORD(32)" 값으로 "dpiAwareness" 속성을 생성하면 “00000000” 값으로 생성된다.

이제 Visual Studio 인스턴스들을 모두 종료한 후에 다시 실행해 보면 Registry에 설정된 값에 의해서 DPI 인식 기능이 꺼지고 WindowForms 디자인 화면이 다시 제대로 보이는 것을 확인할 수 있다.

이를 다시 원상 복구 하기 위해서는 Registry에 추가한 “dpiAwareness” 값을 1 로 설정하거나 생성했던 키를 삭제하면 된다.

완벽한 해결책은 아니지만 Font 나 Icon 등이 조금씩 흐려 보이는 증상 을 제외하고는 아직까지는 큰 문제가 없어 보인다.

첨부자료 : DPI 해결 Registry

Written by Morris (ccambo@gmail.com - MSFL)


공유하기