Post: Suporte VCL para o Per Monitor v2 e o GetSystemMetrics que vem em 10.3

Alessandro Medeiros

Este artigo foi traduzido do artigo http://blog.marcocantu.com/blog/2018-nov-vcl-permonitorv2_getsystemmetrics.html

Na próxima versão 10.3 do RAD Studio, estamos adicionando suporte para o modo Microsoft Per Monitor v2 disponível em versões recentes do Windows 10.

O suporte a vários monitores com diferentes resoluções em aplicativos do Windows, incluindo os da VCL, costuma ser bastante complexo. Um dos problemas enfrentados no passado foi o de solicitar o tamanho dos elementos da plataforma com APIs do Windows, como o GetSystemMetrics, usado para retornar apenas informações para o monitor principal. Por isso, foi difícil, por exemplo, ter uma barra de rolagem personalizada do tamanho certo em monitores secundários com uma resolução diferente.

A Microsoft introduziu novas APIs no Windows 10 para simplificar esse trabalho. Ou seja, eles adicionaram um novo GetSystemMetricsForDPI na atualização do Windows 10 Creator (compilação 1703). A biblioteca VCL faz uso extensivo desta API, no entanto, você não pode simplesmente usar a nova chamada, pois isso quebrará a compatibilidade com o Windows 7 e com versões mais antigas do Windows 10. Portanto, a solução exigia alguma indireta extra.

Primeiro nós adicionamos uma nova função global na unidade VCL.Classes, chamada GetSystemMetricsForWindow. Envia uma chamada para o novo GetSystemMetricsForDPI, se disponível, ou para o GetSystemMetrics tradicional, se não. A nova função possui um parâmetro de identificador adicional, passado para a API, indicando o identificador das janelas nas quais você está interessado (e indiretamente as informações sobre os monitores nos quais ele é exibido).

Segundo, para simplificar o trabalho necessário para atualizar o código VCL existente (o próprio código da biblioteca VCL e seus componentes personalizados ou código do aplicativo), adicionamos um novo método no TControl, chamado GetSystemMetrics. Isso é compatível em termos de parâmetros com a API do Windows de mesmo nome, portanto, uma chamada existente para a API em um de seus componentes é redirecionada para o método, que por sua vez chama GetSystemMetricsForWindow passando o identificador pai do controle como parâmetro. Dessa forma, a maior parte do seu código é “migrada” sem esforço. Finalmente, adicionamos uma propriedade somente leitura CurrentPPI à classe TControl para obter o DPI do controle, dependendo do monitor atual.

Como um exemplo do uso, criei um aplicativo VCL simples com o seguinte código para o evento OnClick de um botão:

Observe que este código está correto desde as primeiras versões do Delphi, invocando a função da API do Windows. Agora, a chamada para GetSystemMetrics é redirecionada, aumentada com o identificador de formulário e retorna um resultado específico do monitor à medida que atinge uma função diferente e mais recente da API do Windows. Eu tenho a mesma chamada no evento OnCreate do formulário, atualizando outro rótulo com o padrão para meu monitor principal de alta resolução (34 pixels). Depois de mover o formulário para o meu monitor secundário de resolução inferior (em que as barras de rolagem levam 17 pixels), você verá o resultado das mesmas alterações de chamada:

Além desta habilitação principal, fizemos atualizações significativas na VCL e seu suporte ao estilo adotando o novo modelo e recomendamos que qualquer gravador de componente faça o mesmo para suportar esse novo modelo da Microsoft DPI. Na maioria dos casos, tudo o que precisávamos fazer era deixar o código como ele. Algumas das métricas são independentes do monitor ou dependem invariavelmente do monitor principal e, nesse caso, você pode forçar uma chamada à API do Windows (prefixando a chamada com a unidade Windows, Windows.GetSystemMetrics (SM_xxx). Além disso, se você Se você tiver alguma chamada em um módulo de dados ou em uma função global ou em uma classe que não herda do TControl, talvez seja necessário reconsiderar sua estrutura de código.

Por fim, facilitamos a ativação do recurso no manifesto de aplicativos, adicionando-o às opções de projeto no IDE, como mostra a seguir. Para um novo projeto VCL, este é o padrão:

Finalmente, há uma ressalva: o Per Monitor V2 (e muitos dos outros recursos de alta DPI no Windows) não têm suporte para o modelo de janelas filho MDI. A Microsoft parou de abordar erros relatados para MDI e recomendamos migrar para um modelo de várias janelas diferentes (várias janelas flutuantes, painéis encaixados, janelas com guias, etc.)

Faça sua busca

CATEGORIAS

POSTS RECENTES

E caso você tem interesse de conhecer mais sobre Suporte VCL para o Per Monitor v2 e o GetSystemMetrics que vem em 10.3, acesse o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI
Você não terá só conteúdos relacionados ao Suporte VCL para o Per Monitor v2 e o GetSystemMetrics que vem em 10.3, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.
Gostou?
Compartilhe:

Embarque no foguete com milhares de devs para aprender desenvolvimento, evoluir de forma contínua e se manter relevante no mercado.

Dúvidas
Cadastre-se em nossa lista

Para ter acesso em primeira mão, a tudo que acontece na Academia do Código, basta se cadastrar em nossa lista

Grupo Thulio Bittencourt | Academia do Código

#FaçaPartedaHistória

Copyright © 2024 – Todos os direitos reservados