Dimensionamento automático no Windows Forms

O dimensionamento automático permite que um formulário e seus controles, projetados em uma máquina com uma determinada resolução de exibição ou fonte do sistema, sejam exibidos adequadamente em outra máquina 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 nas máquinas 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 fonte em um aplicativo do Windows Forms.

Necessidade de dimensionamento automático

Sem o 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 linha de base, sem ajuste ele aparecerá muito pequeno se executado em uma máquina onde a fonte do sistema é Tahoma 12 ponto. Elementos de texto, como títulos, menus, conteúdo de caixa de texto e assim por diante, serão renderizados menores do que outros aplicativos. Além disso, o tamanho dos elementos da interface do usuário (UI) que contêm texto, como a barra de título, menus e muitos controles dependem 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% de dimensionamento de tela, mas monitores de resolução mais alta que suportam 125%, 150%, 200% (que respectivamente equivalem 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 melhorar esses problemas redimensionando automaticamente o formulário e seus controles filho de acordo com o tamanho relativo da fonte ou a resolução de exibição. O sistema operacional Windows oferece suporte ao dimensionamento automático de caixas de diálogo usando uma unidade de medida relativa 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 GetDialogBaseUnitsWin32 SDK . 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 oferece suporte ao dimensionamento automático de acordo com a fonte padrão do sistema 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 ofereciam suporte ao dimensionamento automático de maneira direta que dependia 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 seguinte mecanismo foi usado para implementar o dimensionamento automático:

  1. Em tempo de design, a propriedade (que agora foi preterida) foi definida como a AutoScaleBaseSize altura e a largura da fonte padrão do sistema na máquina do desenvolvedor.

  2. Em tempo de execução, a fonte padrão do sistema da máquina do usuário foi usada para inicializar a Font propriedade da Form classe.

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

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

Embora esse mecanismo fosse suficiente para a maioria dos propósitos, ele sofria das seguintes limitações:

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

  • O dimensionamento automático foi implementado apenas Form na classe, não na ContainerControl classe. 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 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 máquina fossem as mesmas. Da mesma forma, também tornou a herança de um formulário dependente da resolução associada ao formulário pai.

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

  • Ele não dava suporte ao dimensionamento com base diretamente na resolução de vídeo 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, o AutoScale, , AutoScaleBaseSizeApplyAutoScalinge certas Scale sobrecargas são marcadas como obsoletas.

Observação

Você pode excluir com segurança referências a esses membros quando você atualiza 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 para o dimensionamento automático do Windows Forms:

  • O suporte básico para dimensionamento foi movido para a ContainerControl classe para que formulários, controles compostos nativos e controles de usuário recebam suporte de dimensionamento uniforme. Os novos membros AutoScaleFactor, AutoScaleDimensionsAutoScaleMode e PerformAutoScale foram adicionados.

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

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

  • Compatibilidade com gerenciadores de layout, como FlowLayoutPanel e TableLayoutPanel foi adicionado à implementação de escalabilidade automática.

  • Os fatores de escala agora são representados como valores de ponto flutuante, normalmente usando a estrutura, de modo que os erros de SizeF arredondamento foram praticamente eliminados.

Cuidado

Não há suporte para misturas arbitrárias de DPI e modos de dimensionamento de fonte. 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 um registra o modo de dimensionamento e sua resolução atual no AutoScaleMode e AutoScaleDimensions, respectivamente.

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

  3. Quando o formulário é carregado, se os valores de CurrentAutoScaleDimensions e são diferentes, o PerformAutoScale método é chamado para dimensionar o controle e AutoScaleDimensions seus filhos. Esse método suspende o layout e chama o método para executar o Scale 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 OnFontChanged evento se o modo de dimensionamento for Font.

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

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

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

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

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

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

Confira também