Udostępnij za pośrednictwem


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:

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ż