Функция PhysicalToLogicalPointForPerMonitorDPI (winuser.h)
Преобразует точку в окне из физических координат в логические, независимо от количества точек на дюйм (точек на дюйм) вызывающего объекта. Дополнительные сведения об уровнях осведомленности о DPI см. в разделе PROCESS_DPI_AWARENESS.
Синтаксис
BOOL PhysicalToLogicalPointForPerMonitorDPI(
[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_PER_MONITOR_AWARE создает окно на одном мониторе, где коэффициент масштабирования составляет 200 % (192 точек на дюйм). Если оба приложения вызывают GetWindowRect в этом окне, они получат разные значения. Приложение PROCESS_DPI_UNAWARE получит прямоугольник на основе координат 96 точек на дюйм, а приложение PROCESS_PER_MONITOR_AWARE получит координаты, соответствующие фактическому DPI монитора. Если PROCESS_DPI_UNAWARE требуется прямоугольник, возвращенный системой в приложение PROCESS_PER_MONITOR_AWARE , он может вызвать LogicalToPhysicalPointForPerMonitorDPI для углов своего прямоугольника и передать дескриптор в окно приложения PROCESS_PER_MONITOR_AWARE . При этом будут возвращены точки на основе осведомленности другого приложения, которые можно использовать для создания прямоугольника. Это работает, так как PROCESS_PER_MONITOR_AWARE использует фактическое значение DPI монитора, логические и физические координаты идентичны.
Требования
Минимальная версия клиента | 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) |