Acessibilidade ativa e dimensionamento de tela do Windows Vista
O Windows Vista permite que os usuários alterem a configuração de pontos por polegada (dpi) para que a maioria dos elementos da interface do usuário na tela pareça maior. Embora esse recurso esteja disponível há muito tempo no Microsoft Windows, em versões anteriores o dimensionamento tinha que ser implementado por aplicativos. No Windows Vista, o Desktop Window Manager executa o dimensionamento padrão para todos os aplicativos que não manipulam seu próprio dimensionamento. Os aplicativos cliente do Microsoft Ative Accessibility devem levar esse recurso em consideração.
Dimensionamento no Windows Vista
A configuração dpi padrão é 96, o que significa que 96 pixels ocupam uma largura ou altura de uma polegada nocional. A medida exata de uma "polegada" depende do tamanho e da resolução física do monitor. Por exemplo, em um monitor de 12 polegadas de largura, com uma resolução horizontal de 1280 pixels, uma linha horizontal de 96 pixels se estende cerca de 9/10 de polegada.
Alterar a configuração de dpi não é o mesmo que alterar a resolução da tela. Com o dimensionamento de dpi, o número de pixels físicos na tela permanece o mesmo. No entanto, o dimensionamento é aplicado ao tamanho e ao local dos elementos da interface do usuário. Esse dimensionamento pode ser executado automaticamente pelo Desktop Window Manager (DWM) para a área de trabalho e para aplicativos que não pedem explicitamente para não serem dimensionados.
Com efeito, quando o utilizador define o fator de escala para 120 dpi, uma polegada vertical ou horizontal no ecrã torna-se maior em 25 por cento. Todas as dimensões são dimensionadas de acordo. A distância de uma janela das bordas superior e esquerda da tela aumenta em 25 por cento. O tamanho da janela aumenta na mesma proporção, juntamente com os deslocamentos e tamanhos de todos os elementos da interface de utilizador que ela contém.
Por padrão, o DWM não executa o dimensionamento para aplicativos sem reconhecimento de dpi quando o usuário define o dpi como 120, mas o executa quando o dpi é definido como um valor personalizado de 144 ou superior. No entanto, o usuário pode substituir o comportamento padrão.
O dimensionamento de tela cria novos desafios para aplicativos que estão preocupados de alguma forma com as coordenadas da tela. A tela agora contém dois sistemas de coordenadas: físico e lógico. As coordenadas físicas de um ponto são o deslocamento real em pixels a partir do canto superior esquerdo da origem. As coordenadas lógicas são os desfasamentos que ocorreriam se os próprios píxeis fossem redimensionados.
Suponha que você crie uma caixa de diálogo com um botão nas coordenadas (100, 48). Quando essa caixa de diálogo é exibida no padrão de 96 dpi, o botão está localizado nas coordenadas físicas de (100, 48). A 120 dpi, está localizado em coordenadas físicas de (125, 60). Mas as coordenadas lógicas são as mesmas em qualquer configuração dpi: (100, 48).
As coordenadas lógicas são importantes, porque tornam o comportamento do sistema operacional e dos aplicativos consistentes, independentemente da configuração de dpi. Por exemplo, System.Windows.Forms.Cursor.Position normalmente retorna as coordenadas lógicas. Se você mover o cursor sobre um elemento em uma caixa de diálogo, as mesmas coordenadas serão retornadas, independentemente da configuração dpi. Se você desenhar um controle em (100, 100), ele será desenhado para essas coordenadas lógicas e ocupará a mesma posição relativa em qualquer configuração de dpi.
Escalonamento em clientes de acessibilidade ativa
Microsoft Ative Accessibility não usa coordenadas lógicas. Os seguintes métodos e funções retornam coordenadas físicas ou as tomam como parâmetros.
Por padrão, um aplicativo cliente do Microsoft Ative Accessibility em execução em um ambiente sem 96 dpi não poderá obter resultados corretos dessas chamadas. Por exemplo, como a posição do cursor está em coordenadas lógicas, o cliente não pode simplesmente passar essas coordenadas para AccessibleObjectFromPoint para obter o elemento que está sob o cursor.
Além disso, um aplicativo que cria uma janela fora de sua área de cliente, como um aplicativo de acessibilidade que destaca elementos focados da interface do usuário, não criará a janela no local correto da tela, porque a janela será colocada nas coordenadas lógicas, não nas coordenadas físicas retornadas por IAccessible::accLocation.
A solução está dividida em duas partes:
- Torne o aplicativo cliente "dpi-aware". Para fazer isso, chame a função SetProcessDPIAware na inicialização. Esta função torna todo o processo com reconhecimento de DPI, o que significa que todas as janelas que pertencem ao processo não sofrem escala.
- Use funções que reconhecem o dpi. Por exemplo, para obter as coordenadas do cursor, chame a funçãoGetPhysicalCursorPos. Não utilize GetCursorPos; Seu comportamento em aplicativos com reconhecimento de DPI é indefinido.
Se o seu aplicativo executa comunicação direta entre processos com aplicativos sem reconhecimento de DPI, você poderá precisar de converter entre coordenadas lógicas e físicas usando as funções PhysicalToLogicalPoint e LogicalToPhysicalPoint.