.Net Framework 4.7 용 응용 프로그램을 대상으로 지정하고 Windows 10 v1703 (Creators Update Build 15063)에서 실행하십시오. 함께 윈도우 10 (v1703)에서 닷넷 4.7, MS는 DPI 개선을 많이했다 .
.NET Framework 4.7부터 Windows Forms에는 일반적인 높은 DPI 및 동적 DPI 시나리오를위한 향상된 기능이 포함되어 있습니다. 여기에는 다음이 포함됩니다.
MonthCalendar 컨트롤 및 CheckedListBox 컨트롤과 같은 여러 Windows Forms 컨트롤의 확장 및 레이아웃이 향상되었습니다.
단일 패스 스케일링. .NET Framework 4.6 및 이전 버전에서는 여러 단계를 통해 스케일링이 수행되어 일부 컨트롤이 필요한 것보다 더 스케일링되었습니다.
Windows Forms 응용 프로그램이 시작된 후 사용자가 DPI 또는 배율을 변경하는 동적 DPI 시나리오 지원
이를 지원하려면 응용 프로그램 매니페스트를 응용 프로그램에 추가하고 응용 프로그램이 Windows 10을 지원한다는 신호를 보내십시오.
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
다음으로 app.config
Per Monitor Aware 앱을 추가 하고 선언하십시오. 이것은 이제 app.config에서 수행되며 이전과 같은 매니페스트에서는 수행되지 않습니다!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
이 PerMonitorV2 는 Windows 10 Creators Update 이후 새로 추가되었습니다.
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Per Monitor v2라고도합니다. 응용 프로그램이 최상위 창 단위로 새로운 DPI 관련 스케일링 동작에 액세스 할 수 있도록 원래 모니터 별 DPI 인식 모드를 개선했습니다.
하위 창 DPI 변경 알림 -Per Monitor v2 컨텍스트에서 전체 창 트리에 발생하는 DPI 변경이 통지됩니다.
비 클라이언트 영역 확장 -모든 창에는 비 클라이언트 영역이 DPI에 민감한 방식으로 자동 그려집니다. EnableNonClientDpiScaling에 대한 호출은 필요하지 않습니다.
S 는 Win32 메뉴의 caling - 당 모니터 v2의 맥락에서 생성 된 모든 NTUSER 메뉴는 당 모니터 방식으로 확장 될 것입니다.
대화 상자 스케일링 -Per Monitor v2 컨텍스트에서 작성된 Win32 대화 상자는 DPI 변경에 자동으로 응답합니다.
comctl32 컨트롤의 향상된 스케일링 -다양한 comctl32 컨트롤이 Per Monitor v2 컨텍스트에서 향상된 DPI 스케일링 동작을 갖습니다.
향상된 테마 동작 -Per Monitor v2 창의 컨텍스트에서 열린 UxTheme 핸들은 해당 창과 연관된 DPI 측면에서 작동합니다.
이제 3 개의 새로운 이벤트를 구독하여 DPI 변경에 대한 알림을받을 수 있습니다.
Control.DpiChangedAfterParent ( 발사 됨) 컨트롤의 부모 컨트롤이나 폼에 대한 DPI 변경 이벤트가 발생한 후 컨트롤의 DPI 설정이 프로그래밍 방식으로 변경되면 발생합니다.
Control.DpiChangedBeforeParent- 부모 컨트롤이나 폼에 대한 DPI 변경 이벤트가 발생하기 전에 컨트롤의 DPI 설정이 프로그래밍 방식으로 변경되면 시작됩니다.
Form.DpiChanged . 양식이 현재 표시된 디스플레이 장치에서 DPI 설정이 변경되면 시작됩니다.
DPI 처리 / 확장에 대한 3 가지 도우미 방법도 있습니다.
Control.LogicalToDeviceUnits- 값을 논리에서 장치 픽셀로 변환합니다.
Control.ScaleBitmapLogicalToDevice- 비트 맵 이미지를 장치의 논리적 DPI로 조정합니다.
Control.DeviceDpi- 현재 장치의 DPI를 반환합니다.
여전히 문제가 표시되면 app.config 항목을 통해 DPI 개선 사항을 옵트 아웃 할 수 있습니다 .
소스 코드에 액세스 할 수없는 경우 Windows 탐색기에서 응용 프로그램 속성으로 이동하여 호환성으로 이동하여 System (Enhanced)
DPI 처리를 향상시키기 위해 GDI 스케일링을 활성화합니다.
GDI 기반 Windows 응용 프로그램의 경우 이제 모니터별로 DPI를 확장 할 수 있습니다. 즉, 이러한 응용 프로그램은 마술처럼 모니터 당 DPI를 인식하게됩니다.
이러한 모든 단계를 수행하면 WinForms 응용 프로그램에 대해 더 나은 DPI 경험을 얻을 수 있습니다. 그러나 .net 4.7 용 앱을 대상으로하고 Windows 10 Build 15063 (Creators Update) 이상이 필요합니다. 다음 Windows 10 업데이트 1709에서는 더 많은 기능이 개선 될 수 있습니다.
NumericUpDown
Margin
제대로 확장되지 않습니다 . 여백이 두 번 조정 된 것 같습니다. 한 번 축소하면 좋아 보입니다.