Compartilhar via


Direct2D e DPI alto

Escrever um aplicativo com reconhecimento de DPI é a chave para fazer com que uma interface do usuário pareça consistentemente boa em uma ampla variedade de configurações de exibição de alto DPI. Um aplicativo que não tem reconhecimento de DPI, mas está em execução em uma configuração de exibição de alto DPI, pode sofrer com muitos artefatos visuais, incluindo dimensionamento incorreto de elementos de interface do usuário, texto recortado e imagens desfocadas. Ao adicionar suporte em seu aplicativo para reconhecimento de DPI, você torna a apresentação da interface do usuário do aplicativo mais previsível, tornando-a mais visualmente atraente e mais fácil de ler para os usuários. Felizmente, Direct2D torna mais fácil do que nunca escrever aplicativos que funcionam bem no alto DPI. Este tópico inclui as seções a seguir.

Suporte a Alto DPI no Direct2D

Direct2D fornece os seguintes recursos para trabalhar com cenários de alto DPI:

  • Ele respeita automaticamente o DPI do sistema ao criar um destino de renderização em janelas, desde que o manifesto do aplicativo indique que o aplicativo manipula o DPI corretamente. (Para obter informações sobre como declarar que seu aplicativo tem reconhecimento de DPI, consulte How to Ensure That Your Application Displays Properly on High-DPI Displays.)
  • Ele expressa coordenadas em DIPs (Pixels Independentes de Dispositivo), o que permite que o aplicativo seja dimensionado automaticamente quando a configuração de DPI for alterada.
  • Ele permite que bitmaps tenham um DPI e os dimensione corretamente levando o DPI em conta. Esse recurso também pode ser usado para manter ícones em resoluções diferentes.
  • Ele expressa a maioria dos recursos em DIPs, o que torna os recursos automaticamente independentes da resolução.
  • Ele usa um espaço de coordenadas de ponto flutuante e suavização, para que qualquer conteúdo possa ser dimensionado para qualquer DPI arbitrário.

O pipeline gráfico Direct2D foi projetado para ser dimensionado de 96 DPI para 1200DPI.

Windows 8 e DPI alto

A partir do Windows 8, há recursos adicionais para suporte a alto DPI.

Se o DPI de contexto do dispositivo for alto o suficiente, Direct2D alterará o limite usado para habilitar a suavização vertical do texto. Isso resulta em uma renderização de texto mais rápida em telas de alto DPI. Além disso, você pode alternar o modo de unidade para pixels em vez de DIPs usando o método ID2D1DeviceContext::SetUnitMode . Se você definir o modo de unidade como pixels e o DPI de contexto do dispositivo para o DPI de tela, a otimização ainda estará habilitada.

O que é um DIP?

Um DIP (pixel independente do dispositivo) é um pixel lógico que mapeia para os pixels do dispositivo físico por meio de um escalar, o DPI. DPI significa pontos por polegada, em que um ponto representa um pixel de dispositivo físico. (A nomenclatura vem da impressão, onde os pontos são o menor ponto de tinta que um processo de impressão consegue produzir). Como um monitor padrão costumava ter 96 pontos por polegada, um DPI de 96 significava que um pixel independente do dispositivo (ou DIP) mapeava 1:1 com um pixel físico. Por exemplo, se o DPI fosse 96*2 = 192, um único DIP abrangeria dois pixels físicos.

Há muitos motivos pelos quais os aplicativos não lidam necessariamente com esse dimensionamento corretamente; um dos motivos mais simples é que ele requer trabalho extra para descobrir e usar esse valor escalar durante a renderização. Em Direct2D, o dimensionamento é aplicado por padrão. Devido a esse mapeamento, os pixels de dispositivo físico podem acabar em coordenadas DIP fracionárias, o que é um dos motivos pelos quais Direct2D usa um espaço de coordenadas de ponto flutuante.

pixel físico = (dip × DPI) / 96

Para converter um pixel físico em um DIP, use esta fórmula:

dip = (pixel físico × 96) / DPI

Observação

Começando com Windows 8, você pode alternar o modo de unidade para pixels em vez de DIPs usando o método ID2D1DeviceContext::SetUnitMode.

 

Como garantir que seu aplicativo seja exibido corretamente em telas de alto DPI