Compartilhar via


Alto suporte a DPI no Windows Forms

A partir do .NET Framework 4.7, o Windows Forms inclui aprimoramentos para cenários comuns de DPI alta e DPI dinâmica. Estes incluem:

  • Melhorias no dimensionamento e layout de vários controles do Windows Forms, como o controle MonthCalendar e o controle CheckedListBox.

  • Escalonamento de passagem única. No .NET Framework 4.6 e versões anteriores, o dimensionamento foi executado por meio de várias passagens, o que fez com que alguns controles fossem dimensionados mais do que o necessário.

  • Suporte para cenários de DPI dinâmicos em que o usuário altera o fator de DPI ou escala depois que um aplicativo do Windows Forms é iniciado.

Nas versões do .NET Framework que começam com o .NET Framework 4.7, o suporte a DPI alto aprimorado é um recurso de aceitação. Você deve configurar seu aplicativo para tirar proveito dele.

Configurando seu aplicativo do Windows Forms para alto suporte a DPI

Os novos recursos do Windows Forms que dão suporte à alta conscientização de DPI estão disponíveis apenas em aplicativos direcionados ao .NET Framework 4.7 e que estão em execução em sistemas operacionais Windows a partir do Windows 10 Creators Update.

Além disso, para configurar o alto suporte a DPI em seu aplicativo do Windows Forms, você deve fazer o seguinte:

  • Declare compatibilidade com o Windows 10.

    Para fazer isso, adicione o seguinte ao arquivo de manifesto:

    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
      <application>
        <!-- Windows 10 compatibility -->
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
      </application>
    </compatibility>
    
  • Habilite o reconhecimento de DPI por monitor no arquivo app.config.

    O Windows Forms apresenta um novo elemento <System.Windows.Forms.ApplicationConfigurationSection> para dar suporte a novos recursos e personalizações adicionados a partir do .NET Framework 4.7. Para aproveitar os novos recursos que dão suporte a DPI alta, adicione o seguinte ao arquivo de configuração do aplicativo.

    <configuration>
      <!-- ... other xml settings ... -->
    
      <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
      </System.Windows.Forms.ApplicationConfigurationSection>
    
    </configuration>
    

    Importante

    Nas versões anteriores do .NET Framework, você usou o manifesto para adicionar alto suporte a DPI. Essa abordagem não é mais recomendada, pois substitui as configurações definidas no arquivo app.config.

  • Chame o método estático EnableVisualStyles.

    Essa deve ser a primeira chamada de método no ponto de entrada do aplicativo. Por exemplo:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form2());
    }
    

Escolher não utilizar funcionalidades individuais de DPI alto

Definir o valor DpiAwareness para PerMonitorV2 habilita todos os recursos de reconhecimento de DPI com suporte no .NET Framework 4.7 e posteriores. Normalmente, isso é adequado para a maioria dos aplicativos do Windows Forms. No entanto, talvez você queira recusar um ou mais recursos individuais. O motivo mais importante para fazer isso é que o código do aplicativo existente já manipula esse recurso. Por exemplo, se o aplicativo manipular o dimensionamento automático, convém desabilitar o recurso de redimensionamento automático da seguinte maneira:

<configuration>
  <!-- ... other xml settings ... -->

  <System.Windows.Forms.ApplicationConfigurationSection>
    <add key="DpiAwareness" value="PerMonitorV2" />
    <add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
  </System.Windows.Forms.ApplicationConfigurationSection>

</configuration>

Para obter uma lista de chaves individuais e seus valores, confira Adicionar elemento de configuração do Windows Forms.

Novos eventos de alteração de DPI

A partir do .NET Framework 4.7, três novos eventos permitem lidar programaticamente com alterações de DPI dinâmicas:

  • DpiChangedAfterParent, que é disparado quando a configuração de DPI para um controle é alterada programaticamente após ocorrer um evento de alteração de DPI para o controle pai ou formulário correspondentes.
  • DpiChangedBeforeParent, que é disparado quando a configuração de DPI de um controle é alterada programaticamente antes de ocorrer um evento de alteração de DPI do controle pai ou formulário correspondentes.
  • DpiChanged, que é acionado quando a configuração de DPI é alterada no dispositivo de exibição em que o formulário é exibido no momento.

Novos métodos auxiliares e propriedades

O .NET Framework 4.7 também adiciona uma série de novos métodos auxiliares e propriedades que fornecem informações sobre o dimensionamento de DPI e permitem que você execute o dimensionamento de DPI. Estes incluem:

Considerações sobre controle de versão

Além de ser executado no .NET Framework 4.7 e windows 10 Creators Update, seu aplicativo também pode ser executado em um ambiente no qual ele não é compatível com melhorias de DPI altas. Nesse caso, você precisará desenvolver um fallback para seu aplicativo. Você pode fazer isso para executar o desenho personalizado para lidar com o dimensionamento.

Para fazer isso, você também precisa determinar o sistema operacional no qual seu aplicativo está em execução. Você pode fazer isso com código como o seguinte:

// 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));

Observe que seu aplicativo não detectará com êxito o Windows 10 se ele não estiver listado como um sistema operacional com suporte no manifesto do aplicativo.

Você também pode verificar a versão do .NET Framework na qual o aplicativo foi criado:

Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName);

Consulte também