Como configurar um aplicativo para ser executado corretamente em uma máquina com alta configuração de DPI (por exemplo, 150%)?

Eu criei um aplicativo WinForms simples em c #. Quando executo o aplicativo em uma máquina com configurações de DPI alto (por exemplo, 150%), o aplicativo é ampliado. Por enquanto, tudo bem! Mas, em vez de renderizar as fonts com um tamanho de fonte maior, todos os textos também são aumentados. Isso, obviamente, leva a textos muito borrados (em todos os controles, como botões, etc.).

Janelas não deveriam cuidar de renderizar os textos corretamente? Por exemplo, a barra de título do meu aplicativo é renderizada nítida e clara.

Depois que você passar de 100% (ou 125% com a checkbox de seleção “Escala de DPI ao estilo XP” marcada), o Windows, por padrão, assumirá o dimensionamento de sua interface do usuário. Isso acontece fazendo com que seu aplicativo renderize sua saída para um bitmap e desenhe esse bitmap na canvas. O reescalonamento desse bitmap faz com que o texto pareça inevitavelmente confuso. Um recurso chamado “Virtualização de DPI”, mantém os programas antigos utilizáveis ​​em monitores de alta resolução.

Você precisa explicitamente informar que pode manipular configurações de DPI mais altas adicionando o elemento ao seu manifesto. A página do MSDN está aqui, mas não está completa, pois está omitindo as configurações do UAC. Projeto + Adicionar Novo Item, selecione “Arquivo de Manifesto do Aplicativo”. Edite o texto do manifesto ou copie / cole isto:

 < ?xml version="1.0" encoding="utf-8"?>            true    

Você também pode pinvoke SetProcessDPIAware () em seu método Main (), necessário por exemplo, se você implantar com ClickOnce:

  [STAThread] static void Main() { if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); // Edit as needed } [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern bool SetProcessDPIAware(); 

UPDATE, esta necessidade comum é, finalmente, um pouco mais fácil se você usar o VS2015 Update 1 ou superior. O manifesto adicionado já tem a diretiva relevante, basta remover os comentários.


Palavra-chave para pesquisa para que eu possa encontrar este post de volta: dpiAware

As aplicações podem ser desenvolvidas em dois modos diferentes.

A primeira é declarar que nosso aplicativo não está ciente de DPI (não declarar nada será padronizado para isso). Nesse caso, o sistema operacional renderizará nosso aplicativo com o esperado 96 DPI e, em seguida, fará o dimensionamento de bitmap discutido anteriormente. O resultado será um aplicativo com aparência borrada, mas com um layout correto.

A segunda opção é declarar o aplicativo como ciente de DPI. Nesse caso, o sistema operacional não fará nenhum dimensionamento e permitirá que seu aplicativo seja renderizado de acordo com o DPI original da canvas. No caso de um ambiente por monitor-DPI, seu aplicativo será renderizado com o mais alto DPI de todas as canvass, então este bitmap será reduzido para o tamanho adequado para cada monitor. O downscaling resulta em uma melhor experiência de visualização do que em upscaling, mas você ainda pode notar alguma imprecisão.

Se você quiser evitar isso, você deve declarar seu aplicativo como ciente por monitor-DPI. Em seguida, você deve detectar quando seu aplicativo é arrastado por diferentes monitores e processá-los de acordo com o DPI do atual.

Declarar o reconhecimento de DPI é feito em um arquivo de manifesto.

consulte o link a seguir stackoverflow

Nenhuma dessas sugestões funcionou para mim, mas, algo aconteceu depois que eu removi o Form.Font = new … do Form.Design.cs , o formulário começou a resize corretamente, ele funciona se a fonte estiver definida no construtor ou não de todo. Por quê? Alguém pode explicar, eu só posso falar sobre a mudança que fiz e levei alguns minutos para descobrir que era a causa da forma que eu estava trabalhando. Espero que ajude.

Usando o .NET Framework 4.7 e o Windows 10 Creators Update ou mais recentes, você deve fazer o seguinte para configurar o suporte à alta DPI para o aplicativo Windows Form:

Declare a compatibilidade com o Windows 10.

Para fazer isso, adicione o seguinte ao seu arquivo de manifest :

       

Ative o app.config DPI por monitor no arquivo app.config .

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

    

Importante

Nas versões anteriores do .NET Framework, você usou o manifesto para adicionar suporte à alta 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 input do seu aplicativo. Por exemplo:

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

A vantagem disso é o suporte para cenários de DPI dynamic em que o usuário altera o DPI ou o fator de escala após o lançamento de um aplicativo Windows Forms.

Fonte: suporte a alta DPI no Windows Forms