본문 바로가기
Programming Tech/IDE

[Visual Studio]DPI 인식 옵션 설정, 모니터 배율 변경으로 UI 크기 고정하기

by 희품 2019. 1. 30.
반응형

Visual Studio 옵션을 이용하여, 모니터 배율에 상관없이 동일한 크기의 UI를 구현해보자.

 

요약

 

모니터 배율에 상관없이 동일한 크기의 UI를 구현하고 싶으시면, Visual Stduio 프로젝트 옵션(속성 페이지)에서 구성 속성 - 매니페스트 도구 - 입력 및 출력 - DPI 인식(DPI awareness)을 모니터 단위 높은 DPI 인식(Per Monitor High DPI Aware)으로 설정하고 빌드하시면 됩니다.

 

 

모니터가 발전하고, Windows 운영체제가 발전하면서, 이제는 해상도에 상관없이 돋보기처럼 배율을 조절할 수 있는 환경이 된지 꽤 되었습니다. 바탕화면에서 오른쪽 클릭, 디스플레이만 누르면 바로 설정을 할 수 있죠.

디스플레이 설정

 

Win10 기준으로 배율 및 레이아웃 칸에서 바로 배율을 조절할 수 있는데, 배율을 크게 늘리면 동일한 모니터 크기에 아이콘이나, 화면 구성요소들이 다 확대가 되는 것을 보실 수 있습니다.

 

 

Display 배율과 DPI

DPI는 단위 인치 당 점을 얼마나 찍느냐에 대한 기준입니다. 예전에는 96 DPI를 기준으로 물리적인 모니터가 출시되다가, 최근에는 300 DPI 이상의 모니터가 출시되고 있죠. 모니터 크기 뿐만 아니라, 모니터의 1인치에 더 많은 점을 찍을 수 있는 기술이 발전된거죠.

여기서 중요한 것은 예전에는 96 DPI가 기준이었다는 겁니다. 기존의 사용자 Windows 프로그램은 대부분 96 DPI를 고정으로 프로그램 되어있다는거죠.

 

DPI 인식과 비인식의 차이

Windows 프로그램은 주로 Visual Studio로 프로그램을 제작하죠. DPI 인식을 설정할 수 있는 옵션이 있는데, Default 값은 DPI 인식 사용 안 함입니다. 기존의 대부분의 사용자 응용 프로그램은 DPI가 96 DPI로 고정되어 있다는 의미이죠.

 

본론으로 들어가면, DPI 인식을 사용하지 않았을 때, 화면 배율을 확대하면, 프로그램은 UI역시 동일하게 늘리는 현상을 보이게 됩니다. 비트맵 스트레칭이라고도 하는데, 프로그램된 UI의 그래픽 크기는 동일하기 때문에, 화면이 확대될 수록 흐려지거나 깨져보이는 현상이 보일 수 잇습니다.

 

Visual Studio에서 제공하는 DPI 인식 옵션


영어 버전

 

Visual Studio 2013 이상부터 확인을 해봤는데, 프로젝트 속성의 매니페스트 도구 - 입력 및 출력에 가면 DPI 인식(DPI awareness) 옵션이 있습니다.  Visual Studio 2017까지는 3가지의 옵션이 제공되고 있습니다.

 

DPI 인식 없음(none)

DPI 인식 없음으로 설정된 응용프로그램은 화면의 DPI 값이 96인 것처럼 렌더링됩니다. 배율이 100%(96 DPI)가 넘어가는 순간부터 Windows는 응용 프로그램의 UI를 예상대로 늘려버리기 때문에, 화면을 흐리게 만들거나 깨지게 만듭니다.

 

높은 DPI 인식(High DPI Aware)

시스템 DPI 인식을 사용한다고 볼 수 있는데, 일반적으로 응용 프로그램이 시작될 때, 연결된 기본 모니터의 DPI를 감지하는 옵션입니다. 초기화하는 동안 단일 DPI에 대한 UI의 레이아웃을 적절하게 조절하죠. 예를 들면 컨트롤 크기를 조정하거나, 글꼴 크기를 설정하는 등의 작업을 OS에서 해주게 됩니다. 모니터 배율이 변경되지 않으면, 기본 모니터에 의해 DPI 배율 조정이 되지 않아 UI가 커져서 흐려지거나 깨지는 현상이 없습니다. 하지만, DPI가 변경되면, DPI가 변경될 때마다 화면이 흐려지게되죠.

한 마디로, 실행중에 DPI 변경에는 무용지물이라는 소리에요.

 

모니터 단위 높은 DPI 인식(Per Monitor High DPI Aware)

Windows 10 (1703) 업데이트 전 후로 기능이 다르게 동작하는데, 그 차이에 대해서는 아래에서 설명하고, 최신을 기준으로보면, 실행중인 디스플레이의 DPI가 변경 될 때마다 그에 맞는 DPI로 올바르게 렌더링 되도록 모니터 별 DPI 인식 모드를 사용하는 옵션입니다. DPI가 변경될 때, Windows는 비트맵을 늘리지 않아 프로그램의 UI가 변경되지 않고, 응용 프로그램에서 처리를 해야 합니다. 따라서, 모니터 배율에 상관없이 UI 크기를 그대로 유지하고 싶으면,모니터 단위 높은 DPI 인식을 설정하고, 응용 프로그램에서 별 다른 처리를 안 해주면 되는거죠. 다시 말하면, 배율이 조정될 때, UI 크기를 변경하고 싶을 때(배율에 맞는 UI 파일 재설정 등) 응용 프로그램에서 처리할 수도 있습니다.


배율 100%


배율 150%

 

DPI 인식 옵션의 비교

 
개인적으로 Windows가 마음에 들지 않는데, 버전 별로 동작이 다르다는 점이 가끔 치명적이라는 것이죠. 모니터 단위 높은 DPI 인식 사용은 Windows 8.1부터 나왔지만, 그 기능은 제약이 많고, Win10 1703 업데이트 이후에야 자동 DPI 스케일링과 DPI 변경 메시지 수신을 상/하위 HWND에서 하는 점 등이 개선되었어요.
 
(잘못 프로그래밍하면 Windows 10에서 잘 되는 게 Windows 8.1에서 안 되는 사례가 생기고, Windows 8.1에서 개발해서, Windows 8.1에서 잘 되는 걸 확인했는데, Windows 10에서 잘못된 동작을 하는 현상을 발견하는 기쁨(?)을 누릴 수 있습니다.)
 
옵션  Windows
지원 버전 
DPI 표시  DPI 변화 시 동작  비고 
없음(None) - 96 DPI  확장 (흐려짐)  
높은 DPI 인식 사용
(high DPI Aware)
 Vista Windows 세션이 시작될 때의 기본 디스플레이 DPI  확장 (흐려짐)  
모니터 단위 높은 DPI 인식 사용
(Per Monitor High DPI Aware)
 8.1  프로그램이 위치한 모니터의 DPI - Top HWND에 DPI 변경 메시지
- DPI 배율 조정 불필요
 
모니터 단위 높은 DPI 인식 사용 V2
(Per Monitor High DPI Aware) V2
 Win10(1703) - 상위, 하위 HWND에 DPI 변경 메시지
- 자동 DPI 조정
  * 비 클라이언트 영역
  * 공통 컨트롤의 테마로 그려진 비트 맵 (comctl32 V6)

  * 대화 상자(CreateDialog
 *)
 

모바일에서는 표가 깨져보일지 모르겠는데요, DPI 인식 설정이 없으면 무조건 96 DPI로 렌더링하고, 높은 DPI 인식 사용 시 시스템 DPI 인식 사용으로 들어가서 Windows 시작 시의 DPI로 렌더링, 모니터 단위 높은 DPI 인식 사용은 실시간 모니터의 DPI로 렌더링 된다라고 생각하시면 될 것 같습니다.
앞서 말씀드렸다 시피, Windows 8.1의 모니터 단위 높은 DPI 인식 사용과 최신 옵션은 동작이 다르니, 심도 있는 프로그래밍은 좀 더 연구가 필요할 것 같습니다.

 

반응형