Dimensionamento automático

O dimensionamento automático permite que um formulário e seus controles, projetados em um computador com uma determinada resolução ou fonte de exibição, sejam exibidos adequadamente em outro computador com uma resolução ou fonte de exibição diferente. Formulários e controles redimensionam de forma inteligente para se manterem consistentes com janelas nativas e outros aplicativos nos computadores dos usuários e de outros desenvolvedores. O dimensionamento automático e os estilos visuais ajudam os aplicativos Windows Forms a manter uma aparência consistente em comparação com os aplicativos nativos do Windows no computador de cada usuário.

Na maioria das vezes, o dimensionamento automático funciona conforme o esperado nos Windows Forms. No entanto, as alterações no esquema de fontes podem ser problemáticas. Para obter um exemplo de como resolver esse problema, consulte Como responder a alterações de esquema de fontes em um aplicativo Windows Forms.

Reconhecimento de DPI no .NET

O reconhecimento de DPI é configurado por meio do arquivo de projeto usando a ApplicationHighDpiMode propriedade, que é definida SystemAware como por padrão. Essa configuração funciona com o sistema de bootstrap do aplicativo para configurar automaticamente o gerenciamento de DPI quando o aplicativo é iniciado.

O modo de DPI padrão e recomendado para aplicativos Windows Forms é SystemAware. Esse modo consulta a configuração de DPI uma vez na inicialização do aplicativo e usa esse valor durante todo o tempo de vida do aplicativo, fornecendo um comportamento de dimensionamento consistente.

Configure o modo DPI no arquivo de projeto:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
  </PropertyGroup>
</Project>

Note

Embora a abordagem recomendada seja configurar o DPI por meio do arquivo de projeto, você ainda pode usar um arquivo de manifesto do aplicativo (app.manifest) para substituir essas configurações. No entanto, o uso do manifesto é desencorajado porque pode causar conflitos com a configuração do aplicativo. Para obter mais informações, consulte Aviso do Compilador WFO0003.

Considerações sobre o designer do Visual Studio

Ao criar formulários em Visual Studio, talvez seja necessário configurar o reconhecimento de DPI do designer separadamente do aplicativo. A partir do Visual Studio 2022 versão 17.8, você pode definir a propriedade ForceDesignerDPIUnaware no arquivo do projeto para que o designer do Windows Forms seja executado no modo não compatível com DPI. Essa configuração ajuda a evitar problemas de renderização ao criar formulários em monitores de alta DPI:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
  </PropertyGroup>
</Project>

Essa propriedade afeta apenas o designer de Visual Studio e não altera a forma como seu aplicativo é executado. Para obter mais informações, consulte Desabilitar o reconhecimento de DPI para resolver problemas de dimensionamento.

Os modos de DPI disponíveis incluem:

  • SystemAware— O aplicativo consulta o DPI uma vez na inicialização e usa esse valor para o tempo de vida do aplicativo.
  • PerMonitor— O aplicativo verifica se há alterações de DPI por monitor e é redimensionado quando o DPI é alterado.
  • PerMonitorV2—Semelhante a PerMonitor, mas permite notificações de alteração de DPI de janelas filhas e comportamento de dimensionamento aprimorado.
  • DpiUnaware— O aplicativo não é dimensionado para alterações de DPI e Windows manipula o dimensionamento.
  • DpiUnawareGdiScaled— Semelhante a, DpiUnaware mas fornece melhor qualidade para conteúdo baseado em GDI.

Para obter mais informações sobre como definir as configurações de DPI, consulte as novidades no Windows Forms para .NET 6.

Necessidade de dimensionamento automático

Sem dimensionamento automático, um aplicativo projetado para uma resolução de exibição ou fonte aparece muito pequeno ou muito grande quando essa resolução ou fonte é alterada. Por exemplo, se você criar um aplicativo usando Tahoma 9 ponto como uma linha de base, sem ajuste, ele aparecerá muito pequeno quando executado em um computador em que a fonte do sistema é Tahoma 12 pontos. Elementos de texto, como títulos, menus e o conteúdo das caixas de texto, aparecem menores do que em outros aplicativos. Além disso, o tamanho dos elementos de interface do usuário que contêm texto, como a barra de título, menus e muitos controles, depende da fonte usada. Neste exemplo, esses elementos também aparecem relativamente menores.

Uma situação análoga ocorre quando você cria um aplicativo para uma determinada resolução de exibição. A resolução de exibição mais comum é de 96 pontos por polegada (DPI), o que equivale a 100% de escala de exibição, mas monitores de maior resolução com suporte a 125%, 150%, 200% (que correspondem, respectivamente, a 120, 144 e 192 DPI) e acima estão se tornando cada vez mais comuns. Sem ajuste, um aplicativo, especialmente um baseado em elementos gráficos, projetado para uma resolução aparece muito grande ou muito pequeno quando executado em outra resolução.

O dimensionamento automático resolve esses problemas redimensionando automaticamente o formulário e seus controles filho de acordo com o tamanho relativo da fonte ou resolução de exibição. O sistema operacional Windows dá suporte ao dimensionamento automático de caixas de diálogo usando uma unidade relativa de medida chamada unidades de diálogo. Uma unidade de diálogo é baseada na fonte do sistema e sua relação com pixels pode ser determinada por meio da função GetDialogBaseUnitsSDK do Win32. Quando um usuário altera o tema usado por Windows, todas as caixas de diálogo são ajustadas automaticamente de acordo. Windows Forms dá suporte ao dimensionamento automático de acordo com a fonte do sistema padrão ou a resolução de exibição. Opcionalmente, você pode desabilitar o dimensionamento automático em um aplicativo.

Cuidado

Não há suporte para misturas arbitrárias de DPI e modos de dimensionamento de fontes. Embora você possa dimensionar um controle de usuário usando um modo (por exemplo, DPI) e colocá-lo em um formulário usando outro modo (Fonte) sem problemas, misturar um formulário base em um modo e um formulário derivado em outro pode levar a resultados inesperados.

Dimensionamento automático em ação

O Windows Forms usa a seguinte lógica para dimensionar automaticamente formulários e seu conteúdo:

  1. Em tempo de design, cada ContainerControl registra o modo de dimensionamento e sua resolução atual nas propriedades AutoScaleMode e AutoScaleDimensions, respectivamente.

  2. Em tempo de execução, a resolução real é armazenada na propriedade CurrentAutoScaleDimensions. A propriedade AutoScaleFactor calcula dinamicamente a proporção entre a resolução de escala no tempo de execução e no tempo de design.

  3. Quando o formulário é carregado, se os valores de CurrentAutoScaleDimensions e AutoScaleDimensions diferem, o PerformAutoScale método é chamado para dimensionar o controle e seus filhos. Esse método suspende o layout e chama o método Scale para executar o dimensionamento real. Posteriormente, o valor de AutoScaleDimensions é atualizado para evitar o dimensionamento progressivo.

  4. PerformAutoScale também é invocado automaticamente nas seguintes situações:

    • Em resposta ao evento OnFontChanged, se o modo de dimensionamento for Font.

    • Quando o layout do controle de contêiner é retomado e uma alteração é detectada nas propriedades AutoScaleDimensions ou AutoScaleMode.

    • Quando um elemento pai ContainerControl está sendo redimensionado. Cada controle de contêiner é responsável por dimensionar os filhos dele usando fatores de dimensionamento próprios e não aquele do respectivo contêiner pai.

  5. Os controles filho podem modificar o próprio comportamento de dimensionamento por vários meios:

    • Sobrescreva a propriedade ScaleChildren para determinar se os controles filhos devem ser dimensionados.

    • Substitua o método GetScaledBounds para ajustar os limites aos quais o controle é redimensionado, mas não a lógica de redimensionamento.

    • Sobrescreva o método ScaleControl para alterar a lógica de dimensionamento do controle atual.

Melhorias em High DPI

.NET inclui melhorias significativas na renderização de alta DPI, especialmente com o modo PerMonitorV2:

  • Reconhecimento de DPI por monitor — os aplicativos se ajustam dinamicamente quando movidos entre monitores com diferentes configurações de DPI.
  • Comportamento de dimensionamento aprimorado — os controles são dimensionados corretamente quando o DPI é alterado, incluindo controles aninhados e controles de contêiner (.NET 6+).
  • Escalonamento do tamanho do formulário—as propriedades MaximumSize e MinimumSize são escalonadas com base nas configurações atuais de DPI do monitor (.NET 7+, habilitado por padrão no .NET 8+).
  • Eventos de alteração de DPI — novos eventos permitem lidar programaticamente com alterações de DPI dinâmicas:
    • DpiChanged— é acionado quando a configuração de DPI é alterada no dispositivo de exibição em que o formulário é exibido no momento.
    • DpiChangedBeforeParent— é acionada quando a configuração de DPI de um controle é alterada programaticamente antes que um evento de alteração de DPI para seu controle pai ou formulário ocorra.
    • DpiChangedAfterParent—É disparado quando a configuração de DPI de um controle é alterada programaticamente após a ocorrência de um evento de alteração de DPI do controle pai ou formulário.

Para obter mais informações sobre melhorias de DPI altas, consulte As novidades em Windows Forms para .NET 6, Novidades em Windows Forms para .NET 7 e Novidades em Windows Forms para .NET 8.

Diferenças do .NET Framework

.NET Framework e .NET lidam com o reconhecimento de DPI de forma diferente:

  • No .NET Framework, configure o reconhecimento de DPI por meio de um arquivo app.config com o <System.Windows.Forms.ApplicationConfigurationSection> elemento.
  • Em .NET, configure o reconhecimento de DPI por meio do arquivo de projeto com a ApplicationHighDpiMode propriedade.
  • .NET Framework usa arquivos de manifesto para configuração de DPI, o que não é mais recomendado.
  • .NET fornece melhor comportamento de dimensionamento e tratamento de alterações de DPI mais confiável.

Para obter informações sobre a configuração de DPI do .NET Framework, consulte Suporte para alta DPI no Windows Forms.

Consulte também