Как обеспечить правильное отображение приложения на дисплеях с высоким разрешением
Хотя 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, выполните следующие действия.
Создайте файл с именем DeclareDPIAware.manifest.
Скопируйте следующий 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>
В VCPROJ-файле проекта добавьте следующую запись в каждый элемент Configuration в разделе VisualStudioProject/Configurations:
<Tool Name="VCManifestTool" AdditionalManifestFiles="DeclareDPIAware.manifest"/>