Функция LogicalToPhysicalPointForPerMonitorDPI (winuser.h)
Преобразует точку в окне из логических координат в физические, независимо от того, какие точки на дюйм (точек на дюйм) учитывает вызывающий объект. Дополнительные сведения об уровнях осведомленности о DPI см. в разделе PROCESS_DPI_AWARENESS.
Синтаксис
BOOL LogicalToPhysicalPointForPerMonitorDPI(
[in] HWND hWnd,
[in, out] LPPOINT lpPoint
);
Параметры
[in] hWnd
Дескриптор окна, преобразование которого используется для преобразования.
[in, out] lpPoint
Указатель на структуру POINT , указывающую логические координаты для преобразования. Новые физические координаты копируются в эту структуру при успешном выполнении функции.
Возвращаемое значение
Возвращает значение TRUE в случае успешного выполнения или FALSE в противном случае.
Комментарии
В Windows 8 приложения с поддержкой системного DPI претворяются между физическим и логическим пространством с помощью PhysicalToLogicalPoint и LogicalToPhysicalPoint. В Windows 8.1 дополнительная виртуализация системных и межпроцессных коммуникаций означает, что для большинства приложений эти API не нужны. В результате в Windows 8.1 эти API больше не преобразуют точки. Система возвращает все точки приложению в собственном пространстве координат. Это поведение сохраняет функциональность для большинства приложений, но есть некоторые исключения, в которых необходимо внести изменения, чтобы убедиться, что приложение работает должным образом.
Например, приложению может потребоваться пройти все дерево окна другого процесса и запросить у системы сведения о окне, зависящие от DPI. По умолчанию система будет возвращать сведения на основе сведений о DPI вызывающего объекта. Это идеально подходит для большинства приложений. Однако вызывающей стороне могут потребоваться сведения на основе сведений о DPI для приложения, связанного с окном. Это может быть необходимо, так как два приложения напрямую отправляют данные, зависящие от DPI. В этом случае приложение может использовать LogicalToPhysicalPointForPerMonitorDPI для получения физических координат, а затем использовать PhysicalToLogicalPointForPerMonitorDPI для преобразования физических координат в логические координаты на основе DPI-осведомленности предоставленного HWND.
Рассмотрим два приложения: одно имеет PROCESS_DPI_AWARENESS значение PROCESS_DPI_UNAWARE , а другое — значение PROCESS_PER_MONITOR_AWARE. Приложение PROCESS_DPI_UNAWARE создает окно на одном мониторе с коэффициентом масштабирования 200 % (192 DPI). Если оба приложения вызывают GetWindowRect в этом окне, они получат разные значения. Приложение PROCESS_DPI_UNAWARE получит прямоугольник на основе координат 96 точек на дюйм, а приложение PROCESS_PER_MONITOR_AWARE получит координаты, соответствующие фактическому DPI монитора. Если PROCESS_PER_MONITOR_AWARE требуется прямоугольник, возвращенный системой в приложение PROCESS_DPI_UNAWARE , он может вызвать LogicalToPhysicalPointForPerMonitorDPI для углов прямоугольника и передать дескриптор в окно приложения PROCESS_DPI_UNAWARE . При этом будут возвращены точки на основе осведомленности другого приложения, которые можно использовать для создания прямоугольника.
Так как приложение со значением PROCESS_DPI_AWARENESSPROCESS_PER_MONITOR_AWARE использует фактическое разрешение монитора, физические и логические координаты для этого приложения одинаковы.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 8.1 [только классические приложения] |
Минимальная версия сервера | Windows Server 2012 R2 [только классические приложения] |
Целевая платформа | Windows |
Header | winuser.h |
Библиотека | User32.lib |
DLL | User32.dll |
Набор API | ext-ms-win-ntuser-window-l1-1-4 (появилось в Windows 10 версии 10.0.14393) |