Compartilhar via


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

Embora DirectWrite resolva muitos problemas de alto DPI para você, há duas etapas que você deve seguir para garantir que seu aplicativo funcione corretamente em telas de alto DPI.

Etapa 1: usar o próprio DPI da janela depois de criá-lo

Isso pode ser feito usando Direct2D ou usando GDI.

Direct2D

A função GetDpiForWindow recupera o valor de pontos por polegada (dpi) de uma janela especificada. Para usar esse valor para definir a largura de uma janela, use a seguinte fórmula:

< DPI> * <largura, em pixels> / <DPI padrão>

... em que DPI é o valor derivado por GetDpiForWindow e o DPI padrão é 96. A fórmula é semelhante ao eixo vertical:

< DPI> * <altura, em pixels> / <DPI vertical padrão>

O exemplo de código na etapa 2.3 de Criar um aplicativo Direct2D simples recupera o DPI de uma janela e, em seguida, define seu tamanho como 640 × 480, dimensionado para o DPI.

Observação

Para um aplicativo de Plataforma Universal do Windows (UWP), você pode usar a propriedade DisplayInformation::LogicalDpi.

GDI

O GDI fornece a função GetDeviceCaps para recuperar informações do dispositivo. Você pode recuperar informações de DPI passando os valores de índice LOGPIXELSX e LOGPIXELSY . A fórmula para determinar o tamanho horizontal e vertical de uma janela é a mesma do exemplo de Direct2D acima.

O código a seguir usa a função GetDeviceCaps para criar uma janela 640 x 480, dimensionada para o DPI do sistema.

FLOAT dpiX, dpiY;

HDC screen = GetDC(0);
dpiX = static_cast<FLOAT>(GetDeviceCaps(screen, LOGPIXELSX));
dpiY = static_cast<FLOAT>(GetDeviceCaps(screen, LOGPIXELSY));
ReleaseDC(0, screen);

hWnd = CreateWindow(
    TEXT("DirectWriteApp"),
    TEXT("DirectWrite Demo App"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    static_cast<INT>(dpiX * 640.f / 96.f),
    static_cast<INT>(dpiY * 480.f / 96.f),
    NULL,
    NULL,
    hInstance,
    NULL);

Etapa 2: declarar que o aplicativo tem reconhecimento de DPI

Quando um aplicativo se declara com reconhecimento de DPI, é uma instrução que especifica que o aplicativo se comporta bem nas configurações de DPI até 200 DPI. No Windows Vista e no Windows 7, quando a virtualização de DPI está habilitada, os aplicativos que não têm reconhecimento de DPI são dimensionados e os aplicativos recebem dados virtualizados das APIs do sistema, como a função GetSystemMetric . Para declarar que seu aplicativo tem reconhecimento de DPI, conclua as etapas a seguir.

  1. Crie um arquivo chamado DeclareDPIAware.manifest.

  2. Copie o xml a seguir no arquivo e salve-o:

    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
      <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
          <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
      </asmv3:application>
    </assembly>
    
  3. No arquivo .vcproj do projeto, adicione a seguinte entrada dentro de cada elemento Configuration em VisualStudioProject/Configurations:

    <Tool
        Name="VCManifestTool"
        AdditionalManifestFiles="DeclareDPIAware.manifest"/>