Alveje seu aplicativo para .Net Framework 4.7 e execute-o no Windows 10 v1703 (Build Creators Update 15063). Com o .Net 4.7 no Windows 10 (v1703), a MS fez muitas melhorias de DPI .
Começando com o .NET Framework 4.7, o Windows Forms inclui aprimoramentos para cenários comuns de alto DPI e dinâmico de DPI. Esses incluem:
Aprimoramentos na escala e no layout de vários controles do Windows Forms, como o controle MonthCalendar e o controle CheckedListBox.
Escala de passagem única. No .NET Framework 4.6 e versões anteriores, o dimensionamento era realizado 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 o lançamento de um aplicativo Windows Forms.
Para suportá-lo, adicione um manifesto de aplicativo ao seu aplicativo e sinalize que ele oferece suporte ao Windows 10:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Em seguida, adicione app.config
e declare o aplicativo por monitor consciente. Agora isso é feito no app.config e NÃO no manifesto como antes!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
Este PerMonitorV2 é novo desde a Atualização do Windows 10 Creators:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Também conhecido como Per Monitor v2. Um avanço sobre o modo de reconhecimento de DPI por monitor original, que permite que os aplicativos acessem novos comportamentos de dimensionamento relacionados a DPI em uma janela por nível superior.
Notificações de alteração de DPI da janela filho - Nos contextos do Monitor v2, toda a árvore da janela é notificada de qualquer alteração de DPI que ocorra.
Dimensionamento da área não cliente - Todas as janelas terão automaticamente sua área não cliente desenhada de maneira sensível ao DPI. As chamadas para EnableNonClientDpiScaling são desnecessárias.
S caling de menus Win32 - menus Todos NTUSER criados em contextos por monitor v2 será escalar de forma per-monitor.
Dimensionamento da caixa de diálogo - as caixas de diálogo Win32 criadas nos contextos Per Monitor v2 responderão automaticamente às alterações de DPI.
Escala aprimorada dos controles comctl32 - Vários controles comctl32 aprimoraram o comportamento da escala de DPI nos contextos Per Monitor v2.
Comportamento de temas aprimorado - os identificadores do UxTheme abertos no contexto de uma janela Per Monitor v2 funcionarão em termos do DPI associado a essa janela.
Agora você pode se inscrever em 3 novos eventos para ser notificado sobre alterações de DPI:
Control.DpiChangedAfterParent , que é acionado Ocorre quando a configuração de DPI para um controle é alterada programaticamente após a ocorrência de um evento de alteração de DPI para seu controle ou formulário pai.
Control.DpiChangedBeforeParent , que é acionado quando a configuração de DPI para um controle é alterada programaticamente antes que ocorra um evento de alteração de DPI para seu controle ou formulário pai.
Form.DpiChanged , que é acionado quando a configuração de DPI muda no dispositivo de exibição em que o formulário está sendo exibido no momento.
Você também tem três métodos auxiliares sobre manipulação / dimensionamento de DPI:
Control.LogicalToDeviceUnits , que converte um valor de pixels lógicos em pixels do dispositivo.
Control.ScaleBitmapLogicalToDevice , que dimensiona uma imagem de bitmap para o DPI lógico de um dispositivo.
Control.DeviceDpi , que retorna o DPI para o dispositivo atual.
Se você ainda encontrar problemas, poderá desativar as melhorias de DPI através das entradas app.config .
Se você não tiver acesso ao código-fonte, poderá acessar as propriedades do aplicativo no Windows Explorer, acessar a compatibilidade e selecionar System (Enhanced)
que ativa a escala de GDI para melhorar também o tratamento de DPI:
Para aplicativos baseados no GDI, o Windows agora pode escaloná-los por DPI, por monitor. Isso significa que esses aplicativos, magicamente, se tornarão compatíveis com DPI por monitor.
Execute todas essas etapas e obtenha uma melhor experiência de DPI para aplicativos WinForms. Mas lembre-se de que você precisa direcionar seu aplicativo para .net 4.7 e precisa pelo menos do Windows 10 Build 15063 (Atualização de criadores). Na próxima atualização do Windows 10 1709, poderemos obter mais melhorias.
NumericUpDown
também não dimensionaMargin
adequadamente. Parece que a margem é redimensionada duas vezes. Se eu escalar de volta uma vez, parece bom.