Come assicurarsi che l'applicazione venga visualizzata correttamente nelle visualizzazioni DPI elevate

Anche se DirectWrite risolve molti problemi con dpi elevati per l'utente, è consigliabile eseguire due passaggi per assicurarsi che l'applicazione funzioni correttamente nei display DPI elevati.

Passaggio 1: Usare la dpi della finestra dopo la creazione

Questa operazione può essere eseguita usando Direct2D o usando GDI.

Direct2D

La funzione GetDpiForWindow recupera il valore dei punti per pollice (dpi) per una finestra specificata. Per usare tale valore per impostare la larghezza di una finestra, usare la formula seguente:

< DPI> * <larghezza, in pixel/<DPI predefinita>>

... dove DPI è il valore retrived by GetDpiForWindow e DPI predefinito è 96. La formula è simile per l'asse verticale:

< DPI> * <altezza, in pixel> / <DPI verticale predefinito>

L'esempio di codice nel passaggio 2.3 di Creare un'applicazione Direct2D semplice recupera la DPI di una finestra e quindi imposta la dimensione su 640 × 480, ridimensionata in DPI.

Nota

Per un'app UWP (Piattaforma UWP (Universal Windows Platform)), è possibile usare la proprietà DisplayInformation::LogicalDpi.

GDI

GDI fornisce la funzione GetDeviceCaps per il recupero delle informazioni sul dispositivo. È possibile recuperare le informazioni DPI passando i valori di indice LOGPIXELSX e LOGPIXELSY . La formula per determinare le dimensioni orizzontali e verticali di una finestra è uguale all'esempio Direct2D precedente.

Il codice seguente usa la funzione GetDeviceCaps per creare una finestra da 640 x 480, ridimensionata alla DPI di 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);

Passaggio 2: Dichiarare che l'applicazione è con riconoscimento DPI

Quando un'applicazione dichiara di essere con riconoscimento DPI, è un'istruzione che specifica che l'applicazione si comporta correttamente in impostazioni DPI fino a 200 DPI. In Windows Vista e Windows 7, quando la virtualizzazione DPI è abilitata, le applicazioni non con riconoscimento DPI vengono ridimensionate e le applicazioni ricevono dati virtualizzati dalle API di sistema, ad esempio la funzione GetSystemMetric . Per dichiarare che l'applicazione è con riconoscimento DPI, completare la procedura seguente.

  1. Creare un file denominato DeclareDPIAware.manifest.

  2. Copiare il codice XML seguente nel file e salvarlo:

    <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. Nel file vcproj del progetto aggiungere la voce seguente all'interno di ogni elemento Configuration in VisualStudioProject/Configurations:

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