diff --git a/src/common/Display/dpi_aware.cpp b/src/common/Display/dpi_aware.cpp index 2ed0228ae3..8397430c6d 100644 --- a/src/common/Display/dpi_aware.cpp +++ b/src/common/Display/dpi_aware.cpp @@ -1,7 +1,9 @@ #include "dpi_aware.h" + #include "monitors.h" #include #include +#include namespace DPIAware { @@ -60,6 +62,24 @@ namespace DPIAware } } + void Convert(HMONITOR monitor_handle, RECT& rect) + { + if (monitor_handle == NULL) + { + const POINT ptZero = { 0, 0 }; + monitor_handle = MonitorFromPoint(ptZero, MONITOR_DEFAULTTOPRIMARY); + } + + UINT dpi_x, dpi_y; + if (GetDpiForMonitor(monitor_handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y) == S_OK) + { + rect.left = static_cast(std::round(rect.left * static_cast(dpi_x) / DEFAULT_DPI)); + rect.right = static_cast(std::round(rect.right * static_cast(dpi_x) / DEFAULT_DPI)); + rect.top = static_cast(std::round(rect.top * static_cast(dpi_y) / DEFAULT_DPI)); + rect.bottom = static_cast(std::round(rect.bottom * static_cast(dpi_y) / DEFAULT_DPI)); + } + } + void ConvertByCursorPosition(float& width, float& height) { HMONITOR targetMonitor = nullptr; diff --git a/src/common/Display/dpi_aware.h b/src/common/Display/dpi_aware.h index f93e8f87ad..a63365aa2f 100644 --- a/src/common/Display/dpi_aware.h +++ b/src/common/Display/dpi_aware.h @@ -12,6 +12,7 @@ namespace DPIAware HRESULT GetScreenDPIForPoint(POINT p, UINT& dpi); HRESULT GetScreenDPIForCursor(UINT& dpi); void Convert(HMONITOR monitor_handle, float& width, float& height); + void Convert(HMONITOR monitor_handle, RECT& rect); void ConvertByCursorPosition(float& width, float& height); void InverseConvert(HMONITOR monitor_handle, float& width, float& height); void EnableDPIAwarenessForThisProcess();