Obsługa wysokiej rozdzielczości DPI w formularzach systemu Windows
Począwszy od programu .NET Framework 4.7, formularze systemu Windows zawierają ulepszenia typowych scenariuszy o wysokiej rozdzielczości DPI i dynamicznej rozdzielczości DPI. Należą do nich:
Ulepszenia skalowania i układu wielu kontrolek Windows Forms, takich jak kontrolka MonthCalendar i kontrolka CheckedListBox.
Skalowanie jednoprzepustowe. W programie .NET Framework 4.6 i starszych wersjach skalowanie było przeprowadzane w wielu przebiegach, co spowodowało, że niektóre kontrolki były skalowane bardziej niż było to sobie konieczne.
Obsługa dynamicznych scenariuszy DPI, w których użytkownik zmienia współczynnik DPI lub współczynnik skalowania po uruchomieniu aplikacji Windows Forms.
W wersjach programu .NET Framework, począwszy od programu .NET Framework 4.7, rozszerzona obsługa wysokiej rozdzielczości DPI jest funkcją zgody. Aby móc z niej korzystać, należy skonfigurować aplikację.
Konfigurowanie aplikacji Windows Forms pod kątem obsługi wysokiej rozdzielczości DPI
Nowe funkcje formularzy systemu Windows, które obsługują świadomość wysokiego DPI, są dostępne tylko w aplikacjach przeznaczonych dla .NET Framework 4.7 i działają w systemach operacyjnych Windows, począwszy od Windows 10 Creators Update.
Ponadto aby skonfigurować obsługę wysokiej rozdzielczości DPI w aplikacji Windows Forms, należy wykonać następujące czynności:
Zadeklaruj zgodność z systemem Windows 10.
W tym celu dodaj następujący kod do pliku manifestu:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 10 compatibility --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> </application> </compatibility>
Włącz rozpoznawanie dpi na monitorze w pliku app.config.
Windows Forms wprowadza nowy element
<System.Windows.Forms.ApplicationConfigurationSection>
do obsługi nowych funkcji i dostosowań dodanych począwszy od programu .NET Framework 4.7. Aby skorzystać z nowych funkcji obsługujących wysoką dpi, dodaj następujący kod do pliku konfiguracji aplikacji.<configuration> <!-- ... other xml settings ... --> <System.Windows.Forms.ApplicationConfigurationSection> <add key="DpiAwareness" value="PerMonitorV2" /> </System.Windows.Forms.ApplicationConfigurationSection> </configuration>
Ważny
W poprzednich wersjach programu .NET Framework użyto manifestu w celu dodania obsługi wysokiej rozdzielczości DPI. Takie podejście nie jest już zalecane, ponieważ zastępuje ustawienia zdefiniowane w pliku app.config.
Wywołaj metodę statyczną EnableVisualStyles.
Powinno to być pierwsze wywołanie metody w punkcie wejścia aplikacji. Na przykład:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form2()); }
Rezygnacja z poszczególnych funkcji wysokiej rozdzielczości DPI
Ustawienie wartości DpiAwareness
na wartość PerMonitorV2
umożliwia włączenie wszystkich funkcji rozpoznawania dpi obsługiwanych przez wersje programu .NET Framework, począwszy od programu .NET Framework 4.7. Zazwyczaj jest to odpowiednie dla większości aplikacji Windows Forms. Możesz jednak zrezygnować z jednej lub większej liczby poszczególnych funkcji. Najważniejszą przyczyną jest to, że istniejący kod aplikacji już obsługuje tę funkcję. Jeśli na przykład aplikacja obsługuje skalowanie automatyczne, możesz wyłączyć funkcję automatycznego zmieniania rozmiaru w następujący sposób:
<configuration>
<!-- ... other xml settings ... -->
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
<add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
</System.Windows.Forms.ApplicationConfigurationSection>
</configuration>
Aby uzyskać listę poszczególnych kluczy i ich wartości, zobacz Windows Forms Add Configuration Element.
Nowe zdarzenia zmiany DPI
Począwszy od programu .NET Framework 4.7, trzy nowe zdarzenia umożliwiają programowe obsługę dynamicznych zmian DPI:
- DpiChangedAfterParent, który jest uruchamiany, gdy ustawienie DPI dla kontrolki jest zmieniane programowo po wystąpieniu zdarzenia zmiany DPI dla kontrolki nadrzędnej lub formularza.
- DpiChangedBeforeParent, który jest wyzwalany, gdy ustawienie DPI dla kontrolki jest zmieniane programowo przed wystąpieniem zdarzenia zmiany DPI dla kontrolki nadrzędnej lub formularza.
- DpiChanged, który jest wyzwalany, gdy ustawienie DPI zmienia się na urządzeniu wyświetlania, na którym jest obecnie wyświetlany formularz.
Nowe metody i właściwości pomocnika
Program .NET Framework 4.7 dodaje również szereg nowych metod i właściwości pomocnika, które zapewniają informacje o skalowaniu DPI i umożliwiają przeprowadzanie skalowania DPI. Należą do nich:
LogicalToDeviceUnits, który konwertuje wartość z pikseli logicznych na piksele urządzenia.
ScaleBitmapLogicalToDevice, który skaluje obraz mapy bitowej do logicznego dpi dla urządzenia.
DeviceDpi, które zwraca DPI dla aktualnego urządzenia.
Zagadnienia dotyczące przechowywania wersji
Oprócz działania na platformach .NET Framework 4.7 i Windows 10 Creators Update, twoja aplikacja może również działać w środowisku, w którym nie jest zgodna z ulepszeniami DPI. W takim przypadku, będziesz musiał opracować plan awaryjny dla swojej aplikacji. Możesz to zrobić, aby wykonać niestandardowe rysowanie w celu obsługi skalowania.
W tym celu należy również określić system operacyjny, na którym działa aplikacja. Możesz to zrobić za pomocą kodu w następujący sposób:
// Create a reference to the OS version of Windows 10 Creators Update.
Version OsMinVersion = new Version(10, 0, 15063, 0);
// Access the platform/version of the current OS.
Console.WriteLine(Environment.OSVersion.Platform.ToString());
Console.WriteLine(Environment.OSVersion.VersionString);
// Compare the current version to the minimum required version.
Console.WriteLine(Environment.OSVersion.Version.CompareTo(OsMinVersion));
Pamiętaj, że aplikacja nie wykryje pomyślnie systemu Windows 10, jeśli nie została wyświetlona jako obsługiwany system operacyjny w manifeście aplikacji.
Możesz również sprawdzić wersję programu .NET Framework, dla której utworzono aplikację:
Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName);
Zobacz też
.NET Desktop feedback