Suporte a DPI alto no Windows Forms
A partir do .NET Framework 4.7, o Windows Forms inclui aprimoramentos para cenários comuns de DPI alto e DPI dinâmico. Estão incluídos:
Melhorias no dimensionamento e layout de vários controles de Windows Forms, como o controle MonthCalendar e o controle CheckedListBox.
Dimensionamento de passagem única. No .NET Framework 4.6 e versões anteriores, o dimensionamento era executado por meio de várias passagens, o que fazia com que alguns controles fossem dimensionados mais do que o necessário.
Suporte para cenários de DPI dinâmicos nos quais o usuário altera o DPI ou o fator de escala após a inicialização de um aplicativo Windows Forms.
Em versões do .NET Framework começando com o .NET Framework 4.7, o suporte aprimorado a DPI alto é um recurso opcional. Você deve configurar seu aplicativo para aproveitá-lo.
Configurando seu aplicativo Windows Forms para suporte a DPI alto
Os novos recursos do Windows Forms que oferecem suporte a alto reconhecimento de DPI estão disponíveis apenas em aplicativos destinados ao .NET Framework 4.7 e em execução em sistemas operacionais Windows a partir da Atualização para Criadores do Windows 10.
Além disso, para configurar o suporte a DPI alto em seu aplicativo Windows Forms, você deve fazer o seguinte:
Declarar 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
<System.Windows.Forms.ApplicationConfigurationSection>
elemento para oferecer suporte a novos recursos e personalizações adicionados a partir do .NET Framework 4.7. Para aproveitar os novos recursos que oferecem suporte a DPI alto, 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
Em versões anteriores do .NET Framework, você usava o manifesto para adicionar suporte a DPI alto. 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()); }
Desativar recursos individuais de DPI alto
Definir o valor para PerMonitorV2
habilitar todos os recursos de reconhecimento de DPI alto suportados pelas versões do .NET Framework começando com o DpiAwareness
.NET Framework 4.7. Normalmente, isso é adequado para a maioria dos aplicativos do Windows Forms. No entanto, talvez você queira desativar um ou mais recursos individuais. A razão mais importante para fazer isso é que o código do aplicativo existente já lida com esse recurso. Por exemplo, se o aplicativo lida com 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, consulte Windows Forms Add Configuration Element.
Novos eventos de alteração de DPI
A partir do .NET Framework 4.7, três novos eventos permitem que você manipule programaticamente alterações dinâmicas de DPI:
- DpiChangedAfterParent, que é acionado quando a configuração de DPI de um controle é alterada programaticamente após a ocorrência de um evento de alteração de DPI para seu controle pai ou formulário.
- DpiChangedBeforeParent, que é acionado quando a configuração de DPI para um controle é alterada programaticamente antes de ocorrer um evento de alteração de DPI para seu controle pai ou formulário.
- DpiChanged, que é acionado quando a configuração de DPI é alterada no dispositivo de exibição onde 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 dimensionamento de DPI e permitem que você execute o dimensionamento de DPI. Estão incluídos:
LogicalToDeviceUnits, que converte um valor de lógico em pixels de dispositivo.
ScaleBitmapLogicalToDevice, que dimensiona uma imagem de bitmap para o DPI lógico de um dispositivo.
DeviceDpi, que retorna o DPI do dispositivo atual.
Considerações sobre o controle de versão
Além de ser executado no .NET Framework 4.7 e no Windows 10 Creators Update, seu aplicativo também pode ser executado em um ambiente no qual não é compatível com aprimoramentos de DPI alto. 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á sendo executado. Você pode fazer isso com um 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 que o aplicativo foi criado contra:
Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName);
Confira também
.NET Desktop feedback