Поделиться через


Как обеспечить правильное отображение приложения на дисплеях с высоким разрешением

Хотя DirectWrite решает множество проблем с высоким разрешением, необходимо выполнить два действия, чтобы убедиться, что приложение правильно работает на дисплеях с высоким разрешением.

Шаг 1. Использование собственного DPI окна после его создания

Это можно сделать с помощью Direct2D или GDI.

Direct2D

Функция GetDpiForWindow извлекает значение точек на дюйм (точек на дюйм) для указанного окна. Чтобы использовать это значение для задания ширины окна, используйте следующую формулу:

< DPI> * <ширина, в пикселях> / <разрешение по умолчанию>

... где DPI — это значение, извлеченное командой GetDpiForWindow, а значение по умолчанию — 96. Формула для вертикальной оси аналогична:

< DPI> * <высота, в пикселях> / <по умолчанию по вертикали точек на дюйм>

В примере кода, приведенном на шаге 2.3 раздела Создание простого приложения Direct2D , извлекается значение DPI окна, а затем устанавливается его размер 640 × 480 с масштабированием до DPI.

Примечание

Для приложения универсальная платформа Windows (UWP) можно использовать свойство DisplayInformation::LogicalDpi.

GDI

GDI предоставляет функцию GetDeviceCaps для получения сведений об устройстве. Сведения о DPI можно получить, передав значения индекса LOGPIXELSX и LOGPIXELSY . Формула определения горизонтального и вертикального размера окна аналогична приведенному выше примеру Direct2D .

В следующем коде используется функция GetDeviceCaps для создания окна 640 x 480, масштабируемого до системного DPI.

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);

Шаг 2. Объявление приложения с поддержкой DPI

Когда приложение объявляет себя с поддержкой DPI, это оператор, указывающий, что приложение хорошо работает при параметрах DPI до 200 DPI. В Windows Vista и Windows 7 при включенной виртуализации DPI приложения, не поддерживающие DPI, масштабируются, а приложения получают виртуализированные данные из системных API, таких как функция GetSystemMetric . Чтобы объявить, что приложение учитывает DPI, выполните следующие действия.

  1. Создайте файл с именем DeclareDPIAware.manifest.

  2. Скопируйте следующий xml-код в файл и сохраните его:

    <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. В VCPROJ-файле проекта добавьте следующую запись в каждый элемент Configuration в разделе VisualStudioProject/Configurations:

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