Skieruj swoją aplikację na .Net Framework 4.7 i uruchom ją pod Windows 10 v1703 (Creators Update Build 15063). Dzięki .Net 4.7 pod Windows 10 (v1703) firma MS wprowadziła wiele ulepszeń DPI .
Począwszy od .NET Framework 4.7, Windows Forms zawiera ulepszenia dla typowych scenariuszy wysokiej rozdzielczości DPI i dynamicznej rozdzielczości DPI. Obejmują one:
Ulepszenia w skalowaniu i układzie wielu kontrolek Windows Forms, takich jak kontrolka MonthCalendar i kontrolka CheckedListBox.
Skalowanie jednoprzebiegowe. W .NET Framework 4.6 i wcześniejszych wersjach skalowanie było wykonywane przez wiele przebiegów, co powodowało, że niektóre kontrolki były skalowane bardziej niż było to konieczne.
Obsługa dynamicznych scenariuszy DPI, w których użytkownik zmienia DPI lub współczynnik skali po uruchomieniu aplikacji Windows Forms.
Aby to obsługiwać, dodaj manifest aplikacji do aplikacji i zasygnalizuj, że Twoja aplikacja obsługuje system Windows 10:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Następnie dodaj app.config
i zadeklaruj aplikację Per Monitor Aware. Jest to TERAZ zrobione w app.config, a NIE w manifeście, jak wcześniej!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
Ten PerMonitorV2 jest nowy od aktualizacji Windows 10 Creators Update:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Znany również jako Per Monitor v2. Ulepszenie w stosunku do oryginalnego trybu świadomości DPI na monitor, który umożliwia aplikacjom dostęp do nowych zachowań skalowania związanych z DPI na podstawie okna najwyższego poziomu.
Powiadomienia o zmianie DPI w oknie podrzędnym - w kontekstach Per Monitor v2 całe drzewo okna jest powiadamiane o wszelkich zmianach DPI, które mają miejsce.
Skalowanie obszaru nieklienckiego - wszystkie okna będą automatycznie narysowane w sposób wrażliwy na DPI. Wywołania EnableNonClientDpiScaling są niepotrzebne.
S caling menu Win32 - Menu Wszystkie NTUSER utworzone w kontekstach Per monitor v2 będzie skalowania w sposób per-monitor.
Skalowanie okien dialogowych - okna dialogowe Win32 utworzone w kontekstach Per Monitor v2 będą automatycznie reagować na zmiany DPI.
Ulepszone skalowanie kontrolek comctl32 - Różne kontrolki comctl32 mają ulepszone zachowanie skalowania DPI w kontekstach Per Monitor v2.
Ulepszone zachowanie motywów - uchwyty UxTheme otwarte w kontekście okna Per Monitor v2 będą działać pod względem DPI skojarzonego z tym oknem.
Teraz możesz zasubskrybować 3 nowe wydarzenia, aby otrzymywać powiadomienia o zmianach DPI:
Control.DpiChangedAfterParent , który jest wyzwalany Występuje, gdy ustawienie DPI formantu zostanie zmienione programowo po wystąpieniu zdarzenia zmiany DPI dla jego kontrolki nadrzędnej lub formularza.
Control.DpiChangedBeforeParent , który jest uruchamiany, gdy ustawienie DPI dla formantu zostanie zmienione programowo przed wystąpieniem zdarzenia zmiany DPI dla jego kontrolki nadrzędnej lub formularza.
Form.DpiChanged , który jest uruchamiany, gdy ustawienie DPI zmienia się na urządzeniu wyświetlającym, na którym formularz jest obecnie wyświetlany.
Masz również 3 pomocnicze metody obsługi / skalowania DPI:
Control.LogicalToDeviceUnits , która konwertuje wartość z pikseli logicznych na piksele urządzenia.
Control.ScaleBitmapLogicalToDevice , która skaluje obraz bitmapowy do logicznego DPI urządzenia.
Control.DeviceDpi , która zwraca wartość DPI dla bieżącego urządzenia.
Jeśli nadal widzisz problemy, możesz zrezygnować z ulepszeń DPI za pośrednictwem wpisów app.config .
Jeśli nie masz dostępu do kodu źródłowego, możesz przejść do właściwości aplikacji w Eksploratorze Windows, przejść do zgodności i wybrać System (Enhanced)
który aktywuje skalowanie GDI, aby również poprawić obsługę DPI:
W przypadku aplikacji opartych na GDI system Windows może teraz skalować DPI w zależności od monitora. Oznacza to, że te aplikacje w magiczny sposób będą rozpoznawać DPI każdego monitora.
Wykonaj wszystkie te kroki, a powinieneś uzyskać lepsze wrażenia z DPI dla aplikacji WinForms. Pamiętaj jednak, że musisz kierować swoją aplikację na .net 4.7 i potrzebujesz co najmniej Windows 10 Build 15063 (Creators Update). W następnej aktualizacji Windows 10 1709 możemy uzyskać więcej ulepszeń.
NumericUpDown
też nie skaluje sięMargin
prawidłowo. Wygląda na to, że margines jest dwukrotnie przeskalowany. Jeśli raz go przeskaluję, wygląda dobrze.