Dimensionamento Automático em Formulários do Windows
Dimensionamento automático permite que um formulário e seus controles, criados em uma máquina com determinada resolução de tela ou fonte do sistema, seja exibido de forma apropriada em outro computador com resolução de tela ou fonte do sistema diferentes. Ele garante que o formulário e seus controles serão inteligentemente redimensionados para serem consistente com janelas nativas e outros aplicativos em máquinas de ambos usuários e outros desenvolvedores. O suporte do .NET Framework para o dimensionamento automático e estilos visuais permite que aplicativos em .NET Framework mantenham uma aparência e estilo consistentes quando comparado a aplicativos nativos do Windows na máquina de cada usuário.
A Necessidade do Dimensionamento Automático
Sem o dimensionamento automático, um aplicativo desenvolvido para resolução de tela ou fonte ou aparecerão muito pequenos ou muito grandes quando esta resolução ou a fonte é alterada. Por exemplo, se o aplicativo é criado usando Tahoma 9 pontos como uma linha de base, sem ajuste ele aparecerá muito pequeno se executado em um computador onde a fonte do sistema é Tahoma 12 pontos. Elementos de texto, como títulos, menus, conteúdo de caixas de texto e assim por diante aparecerão menores do que outros aplicativos. Além disso, o tamanho de elementos da interface do usuário (IU) que contêm texto, como o barra de título, menus e muitos controles dependem da fonte usada. Nesse exemplo, estes elementos também aparecerão relativamente menores.
Uma situação análoga ocorre quando um aplicativo é criado para uma determinada resolução de vídeo. A resolução de vídeo mais comum é 96 pontos por polegada (dpi), mas resoluções mais altas, que suportam 120 133, 170 ou mais 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 procura contornar estes problemas redimensionando automaticamente o formulário e seus controles filhos de acordo com o tamanho relativo de fonte ou resolução de vídeo. O sistema operacional Windows oferece suporte ao dimensionamento automático das 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 através da Função do SDK Win32 GetDialogBaseUnits. Quando um usuário altera o tema usado pelo Windows, todas as caixas de diálogo são automaticamente ajustadas de acordo com o mesmo. Além disso,
O .NET Framework oferece suporte ao dimensionamento automático tanto de acordo com para a fonte padrão do sistema quanto com a resolução de vídeo. Opcionalmente, o dimensionamento automático pode ser desativado em um aplicativo.
Antigo Suporte para Dimensionamento Automático
As versões 1.0 e 1.1 do .NET Framework ofereciam suporte ao dimensionamento automático de uma maneira simples que era dependente da fonte padrão do Windows usada para a interface do usuário, representado pelo valor do SDK do Win32 DEFAULT_GUI_FONT. A fonte tipicamente muda apenas quando a resolução de vídeo muda. O mecanismo a seguir foi usado para implementar o dimensionamento automático:
Em tempo de design, a propriedade AutoScaleBaseSize (que está agora ultrapassada) foi definida como a altura e largura da fonte padrão do sistema no computador de um desenvolvedor.
Em tempo de execução, a fonte padrão do sistema do computador do usuário era usada para inicializar a propriedade Font da classe Form.
Antes de exibir o formulário, o método ApplyAutoScaling era chamado para dimensionar o formulário. Este método calculava o tamanho relativo escala de AutoScaleBaseSize e Font e então chamava o método Scale para de fato dimensionar o formulário e seus filhos.
O valor de AutoScaleBaseSize era atualizado de modo que chamadas subsequentes para ApplyAutoScaling não redimensionassem o formulário progressivamente.
Enquanto esse mecanismo estava suficiente para a maioria das finalidades, ele sofria das seguintes limitações:
Como a propriedade AutoScaleBaseSize representa o tamanho da fonte base como valores inteiros, ocorriam erros de arredondamento que se tornam evidentes quando um formulário é alternado através de várias resoluções.
O dimensionamento automático era implementado somente na classe Form, não na classe ContainerControl. Como resultado, controles de usuário dimensionavam-se corretamente somente quando o controle do usuário era desenvolvido com a mesma resolução do formulário e era colocado no formulário em tempo de design.
Formulários e seus controles filhos podiam ser criados simultaneamente por vários desenvolvedores apenas se as resoluções de seus computadores fossem as mesmas. Da mesma, a herança de um formulário dependia da 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 oferecia suporte ao dimensionamento baseado diretamente na resolução de vídeo, que é necessária para compatibilidade com o .NET Compact Framework.
Embora esse mecanismo seja preservado no .NET Framework versão 2.0 para manter compatibilidade com versões anteriores, ela foi substituída pelo mecanismo de dimensionamento mais robusto descrito a seguir. Como uma consequência, AutoScale, ApplyAutoScaling, AutoScaleBaseSize e determinadas sobrecargas de Scale são marcadas como obsoletas.
Observação |
---|
Você pode excluir com segurança as 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 vence as limitações anteriores, introduzindo as seguintes alterações no dimensionamento automático de Formulários do Windows:
O suporte básico para dimensionamento foi movido para a classe ContainerControl para que formulários, controles compostos nativos e controles do usuário todos recebam suporte uniforme ao dimensionamento. Os novos membros AutoScaleFactor, AutoScaleDimensions, AutoScaleMode e PerformAutoScale foram adicionados.
A classe Control também possui diversos novos membros que permitiem a ela participar do dimensionamento e dar suporte ao dimensionamento misto no mesmo formulário. especificamente, os membros Scale ScaleChildren, e GetScaledBounds oferecem suporte ao dimensionamento.
Suporte para dimensionamento com base na resolução de tela foi adicionado para complementar o suporte com base na fonte do sistema, conforme definido pela enumeração AutoScaleMode. Esse modo é compatível com o dimensionamento automático suportado pelo .NET Compact Framework permitindo migração fácil de aplicativos.
Compatibilidade com os gerentes de layout, como FlowLayoutPanel e TableLayoutPanel foi adicionada à implementação de dimensionamento automático.
Fatores de dimensionamento agora são representados como valores de ponto flutuante, normalmente usando a estrutura SizeF, de modo que erros de arredondamento foram praticamente eliminados.
Aviso
Não há suporte para misturas arbitrárias de modos de dimensionamento de DPI e 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, 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
Os Formulários do Windows agora usam a seguinte lógica para dimensionar automaticamente os formulários e seu conteúdo:
Em tempo de design, cada ContainerControl registra o modo de dimensionamento e sua resolução atual em AutoScaleMode e AutoScaleDimensions, respectivamente.
Em tempo de execução, a resolução real é armazenada na propriedade CurrentAutoScaleDimensions. A propriedade AutoScaleFactor dinamicamente calcula a proporção entre a resolução de dimensionamento do tempo de execução e do tempo de design.
Quando o formulário é carregado, se os valores de CurrentAutoScaleDimensions e AutoScaleDimensions são diferentes, então o método PerformAutoScale é chamado para dimensionar o controle e seus filhos. Este método suspende o layout e chama o método Scale para executar o dimensionamento real. Posteriormente, o valor de AutoScaleDimensions é atualizado para evitar dimensionamento progressivo.
PerformAutoScale é também chamado automaticamente nas seguintes situações:
Em resposta ao evento OnFontChanged se o modo de dimensionamento for Font.
Quando o layout do controle recipiente continua e uma alteração é detectada nas propriedades AutoScaleDimensions ou AutoScaleMode.
Como implícita acima, quando um ContainerControl pai está sendo dimensionado. Cada controle recipiente é responsável por dimensionar seus filhos usando seus próprios fatores de dimensionamento e não o de seu recipiente pai.
Controles filhos podem modificar seu comportamento de dimensionamento por vários meios:
A propriedade ScaleChildren pode ser substituída para determinar se seus controles filhos 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
Tarefas
Como: Ativar estilos do Windows XP Visual
Como: Melhorar o desempenho, evitando o dimensionamento automático