Monitores de alta definição são uma maravilha! Porém trazem um junto um pequeno problema para quem programa Windows Forms com Visual Studio. Observe o exemplo abaixo:
Nesse caso o computador possui dois monitores, ambos 4K. A diferença é que o monitor 1 possui 15″ e o monitor 2 possui 55″. O monitor 2 pode manter o tamanho das fontes em 100% porém o monitor 1, como é muito pequeno para uma definição tão alta necessita que se aplique um fator de ampliação, no caso acima, de 225% para que as letras sejam legíveis.
Até aí tudo bem, até mesmo quando se arrasta uma janela de um monitor para o outro percebe-se como o Windows trata bem essa questão. Quando a janela chega no outro monitor ela já aparece devidamente dimensionada e dentro do padrão do fator de ampliação correto de cada monitor.
Até mesmo o Visual Studio se comporta bem nesse cenário, por se tratar de uma aplicação DPI-Aware, ele se ajusta automaticamente à densidade de pontos do monitor em que está sendo executado.
O problema só existe ao editar um Windows Form, pois o editor de Windows Forms do Visual Studio não possui suporte ao fator de ampliação causando assim uma série de problemas para o programador ao desenhar os forms. Se o programador abre um form que já estava todo desenhado e corretamente alinhado neste cenário, o form fica todo torto, se o programador tenta corrigir, ao executar o programa fica tudo fora do lugar. É um problema louco que tira o sono do programador porque parece que a única solução é voltar para o monitor antigo com fator de ampliação de 100% uma vez que não dá para utilizar um ultrabook com monitor 4K de 15″ sem alterar o fator de ampliação, visto que seria necessário uma lente de aumento para conseguir ver as coisas na tela.
Depois de um longo período de sofrimento com esse problema, durante o qual tive que recorrer ao computador antigo para editar os Windows Forms encontrei a solução nas documentações da Microsoft. Para fazer uso do que vou apresentar certifique-se a versão do seu Visual Studio é a partir de 15.8.
Link para o artigo:
https://docs.microsoft.com/en-us/dotnet/framework/winforms/disable-dpi-awareness-visual-studio
A Solução do Problema
Em primeiro lugar tenha em mente que a versão testada foi a 15.9.6 do Visual Studio Enterprise 2017.
Verifique se as notificações sobre fator de ampliação (DPI Scaling) estão ativadas.
Ao abrir um item Windows Form o Visual Studio irá lhe informar do problema com o fator de ampliação na tarja amarela. No caso em questão o fator está em 225%.
Clique no link “Restart Visual Studio with 100% scaling”. Fazendo isso o programa irá reiniciar em modo DPI-Unaware e o recurso “automatic scaling” estará desativado.
Se fosse só isso seria bem simples, mas tudo na vida tem um custo. Nesse caso, como o automatic scaling está desativado (que define o fator de ampliação) os designers de Windows Presentation Foundation e Universal Windows Platform poderão apresentar problemas. Então caso vá editar itens desse tipo (WPF/UWP) feche todas as abas que estiverem com itens Windows Forms abertos e clique em “Restart Visual Studio with automatic scaling”, que o Visual Studio irá reiniciar em modo DPI-Aware novamente.
Infelizmente, se o seu projeto contém itens Windows Forms e itens WPF/UWP será necessário ficar fazendo esse procedimento de reiniciar o Visual Studio a cada vez que for trocar os itens em que vai trabalhar.
Alternativa Para o Caso do Programador Que Só Utiliza Windows Forms
Se você é um programador que só trabalha com desenvolvimento Windwos Forms há uma alternatica para não precisar ficar passando por esse transtorno. Há uma chave no registry que faz com que o Visual Studio sempre inicie com automatic scaling desligado.
Acesse a seguinte subchave no registry:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
Dentro da subchave crie a seguinte entrada:
Entry: <URI do devenv.exe>
Type: REG_SZ
Value: DPIUNAWARE
A URI do devenv.exe varia conforme a versão que você está utilizando do Visual Studio. Segue alguns exemplos:
Visual Studio 2022 Community:
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe
Visual Studio 2017 Community:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe
Nota:
Caso a sua versão do Visual Studio seja Professional ou Enterprise, substitua a palavra “Community” por “Professional” ou “Enterprise”.
O Visual Studio ficará em modo DPI-Unaware até que você remova esta entrada do registry.
Caso o programador opte por trabalhar em apenas um dos modos talvez seja sensato remover a notificação, alterando para “False” o parâmetro “DPI Scaling Notifications” citado logo no início deste tutorial.
Solução de Problemas
Se a transição entre DPI-Aware e DPI-Unaware não estiver funcionando corretamente, verifique no registry a existência e então elimine o valor “dpiAwareness” que fica na subchave:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\devenv.exe
Conclusão
Apesar de ser chato e trabalhoso ficar trocando os modos de trabalho do Visual Studio, é possível programar em Windows Forms nos computadores com monitor Hi DPI. Este é um contratempo que eu realmente gostaria muito de ver solucionado em alguma versão futura do programa.