Compartilhar via


Dimensionamento automático no Windows Forms

O dimensionamento automático permite que um formulário e seus controles, projetados em um computador com determinada resolução de exibição ou fonte do sistema, sejam exibidos adequadamente em outro computador com uma resolução de exibição ou fonte do sistema diferente. Ele garante que o formulário e seus controles serão redimensionados de forma inteligente para serem consistentes com janelas nativas e outros aplicativos nos computadores dos usuários e de outros desenvolvedores. O suporte do .NET Framework para dimensionamento automático e estilos visuais permite que os aplicativos do .NET Framework mantenham uma aparência consistente quando comparados aos aplicativos nativos do Windows no computador de cada usuário.

Na maioria das vezes, o dimensionamento automático funciona conforme o esperado no .NET Framework versão 2.0 e posterior. No entanto, as alterações no esquema de fontes podem ser problemáticas. Para obter um exemplo de como resolver isso, consulte Como responder a alterações de esquema de fontes em um aplicativo do Windows Forms.

Necessidade de dimensionamento automático

Sem dimensionamento automático, um aplicativo projetado para uma resolução de exibição ou fonte aparecerá muito pequeno ou muito grande quando essa resolução ou fonte for alterada. Por exemplo, se o aplicativo for projetado usando Tahoma 9 ponto como uma linha de base, sem ajuste ele aparecerá muito pequeno se executado em um computador em que a fonte do sistema é Tahoma 12 pontos. Elementos de texto, como títulos, menus e conteúdos de caixas de texto, serão exibidos em tamanhos menores do que nos 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 aparecerão relativamente menores.

Uma situação análoga ocorre quando um aplicativo é projetado 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% na escala de exibição, mas telas com resoluções mais altas, que suportam 125%, 150%, 200% (que respectivamente são iguais a 120, 144 e 192 DPI) e acima, estão se tornando mais comuns. Sem ajuste, um aplicativo, especialmente um baseado em gráficos, projetado para uma resolução, aparecerá muito grande ou muito pequeno quando executado em outra resolução.

O dimensionamento automático busca amenizar 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 através da função GetDialogBaseUnitsdo SDK do Win32. Quando um usuário altera o tema usado pelo Windows, todas as caixas de diálogo são ajustadas automaticamente de acordo. Além disso, o .NET Framework dá suporte ao dimensionamento automático de acordo com a fonte do sistema padrão ou a resolução de exibição. Opcionalmente, o dimensionamento automático pode ser desabilitado em um aplicativo.

Suporte original para dimensionamento automático

As versões 1.0 e 1.1 do .NET Framework deram suporte ao dimensionamento automático de maneira simples, dependendo da fonte padrão do Windows usada para a interface do usuário, representada pelo valor do SDK do Win32 DEFAULT_GUI_FONT. Essa fonte normalmente só é alterada quando a resolução de exibição é alterada. O mecanismo a seguir foi usado para implementar o dimensionamento automático:

  1. Em fase de design, a propriedade AutoScaleBaseSize (que agora está obsoleta) foi definida como a altura e a largura da fonte do sistema padrão no computador do desenvolvedor.

  2. Em runtime, a fonte do sistema padrão do computador do usuário foi usada para inicializar a propriedade Font da classe Form.

  3. Antes de exibir o formulário, o método ApplyAutoScaling foi chamado para dimensionar o formulário. Esse método calculou os tamanhos relativos das escalas de AutoScaleBaseSize e Font, em seguida chamou o método Scale para realmente dimensionar o formulário e seus filhos.

  4. O valor de AutoScaleBaseSize foi atualizado para que as chamadas subsequentes para ApplyAutoScaling não redimensionem progressivamente o formulário.

Embora esse mecanismo tenha sido suficiente para a maioria das finalidades, ele sofreu com as seguintes limitações:

  • Como a propriedade AutoScaleBaseSize representa o tamanho da fonte da linha de base como valores inteiros, ocorrem erros de arredondamento que ficam evidentes quando um formulário é percorrido por várias resoluções.

  • O dimensionamento automático foi implementado apenas na classe Form, não na classe ContainerControl. Como resultado, os controles de usuário seriam dimensionados corretamente somente quando o controle de usuário fosse projetado na mesma resolução que o formulário e ele fosse colocado no formulário em tempo de design.

  • Os formulários e seus controles filho só poderiam ser projetados simultaneamente por vários desenvolvedores se suas resoluções de computador fossem as mesmas. Da mesma forma, também tornou a herança de um formulário condicionada pela resolução associada ao formulário pai.

  • Ele não é compatível com os gerentes de layout mais recentes introduzidos com o .NET Framework versão 2.0, como FlowLayoutPanel e TableLayoutPanel.

  • Ele não deu suporte ao dimensionamento com base diretamente na resolução de exibição necessária para compatibilidade com o .NET Compact Framework.

Embora esse mecanismo seja preservado no .NET Framework versão 2.0 para manter a compatibilidade com versões anteriores, ele foi substituído pelo mecanismo de dimensionamento mais robusto descrito a seguir. Como consequência, as sobrecargas AutoScale, ApplyAutoScaling, AutoScaleBaseSizee certas Scale são marcadas como obsoletas.

Nota

Você pode excluir com segurança as referências a esses membros ao atualizar seu código herdado para o .NET Framework versão 2.0.

Suporte atual para dimensionamento automático

O .NET Framework versão 2.0 supera as limitações anteriores introduzindo as seguintes alterações no dimensionamento automático do Windows Forms:

  • O suporte base para dimensionamento foi movido para a classe ContainerControl para que formulários, controles de composição nativos e controles de usuário recebam suporte a dimensionamento uniforme. Os novos membros AutoScaleFactor, AutoScaleDimensions, AutoScaleMode e PerformAutoScale foram adicionados.

  • A classe Control também tem vários novos membros que permitem que ela participe do dimensionamento e dê suporte ao dimensionamento misto no mesmo formulário. Especificamente, os membros Scale, ScaleChildrene GetScaledBounds dão suporte ao dimensionamento.

  • O suporte para dimensionamento com base na resolução da tela foi adicionado para complementar o suporte à fonte do sistema, conforme definido pela enumeração AutoScaleMode. Esse modo é compatível com o dimensionamento automático compatível com o .NET Compact Framework, permitindo uma migração de aplicativo mais fácil.

  • A compatibilidade com gerentes de layout, como FlowLayoutPanel e TableLayoutPanel, foi adicionada à implementação do dimensionamento automático.

  • Os fatores de dimensionamento agora são representados como valores de ponto flutuante, normalmente usando a estrutura de SizeF, para que os erros de arredondamento tenham sido praticamente eliminados.

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, mas 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 agora 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 a resolução atual no 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 o tempo de execução e a resolução de dimensionamento de tempo de design.

  3. Quando o formulário é carregado, se os valores de CurrentAutoScaleDimensions e AutoScaleDimensions forem diferentes, o método PerformAutoScale será 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, caso o modo de dimensionamento seja Font.

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

    • Como sugerido acima, quando um elemento pai ContainerControl está sendo escalado. Cada controle de contêiner é responsável por dimensionar seus filhos usando seus próprios fatores de dimensionamento e não aquele de seu contêiner pai.

  5. Os controles filho podem modificar seu comportamento de dimensionamento por vários meios:

    • A propriedade ScaleChildren pode ser substituída para determinar se os controles filho devem ser dimensionados ou não.

    • O método GetScaledBounds pode ser substituído para ajustar os limites para os quais o controle é dimensionado, mas não a lógica de dimensionamento.

    • O método ScaleControl pode ser substituído para alterar a lógica de dimensionamento do controle atual.

Consulte também