228 lines
4.3 KiB
C++
228 lines
4.3 KiB
C++
#include "StdAfx.h"
|
|
#include "DpiManager.h"
|
|
|
|
namespace ui
|
|
{
|
|
|
|
DpiManager* DpiManager::GetInstance()
|
|
{
|
|
static DpiManager dpiManager;
|
|
return &dpiManager;
|
|
}
|
|
|
|
DpiManager::DpiManager()
|
|
{
|
|
m_nScaleFactor = 100;
|
|
m_bAdaptDPI = false;
|
|
}
|
|
|
|
UINT DpiManager::GetSystemDPI()
|
|
{
|
|
UINT dpi = 96;
|
|
if (IsWindows8OrGreater()) {
|
|
if (!GetDpiForSystemWrapper(dpi)) {
|
|
dpi = 96;
|
|
}
|
|
}
|
|
else {
|
|
HDC desktopDc = GetDC(NULL);
|
|
dpi = (UINT)GetDeviceCaps(desktopDc, LOGPIXELSX);
|
|
ReleaseDC(0, desktopDc);
|
|
}
|
|
|
|
return dpi;
|
|
}
|
|
|
|
UINT DpiManager::GetMonitorDPI(HMONITOR hMonitor)
|
|
{
|
|
UINT dpix = 96, dpiy = 96;
|
|
if (IsWindows8OrGreater()) {
|
|
if (!GetDpiForMonitorWrapper(hMonitor, MDT_EFFECTIVE_DPI, &dpix, &dpiy)) {
|
|
dpix = 96;
|
|
}
|
|
}
|
|
else {
|
|
HDC desktopDc = GetDC(NULL);
|
|
dpix = (UINT)GetDeviceCaps(desktopDc, LOGPIXELSX);
|
|
ReleaseDC(0, desktopDc);
|
|
}
|
|
|
|
return dpix;
|
|
}
|
|
|
|
UINT DpiManager::GetMainMonitorDPI()
|
|
{
|
|
POINT pt = { 1, 1 };
|
|
HMONITOR hMonitor;
|
|
hMonitor = MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST);
|
|
|
|
return GetMonitorDPI(hMonitor);
|
|
}
|
|
|
|
UINT DpiManager::GetDPIFromRegistry()
|
|
{
|
|
int dpi_value = 96;
|
|
HKEY hKEY;
|
|
long ret = 0;
|
|
ret = ::RegOpenKeyEx(HKEY_CURRENT_USER, L"CONTROL PANEL\\DESKTOP\\WINDOWMETRICS", 0, KEY_ALL_ACCESS, &hKEY);
|
|
if (ret != ERROR_SUCCESS)
|
|
{
|
|
::RegCloseKey(hKEY);
|
|
}
|
|
else
|
|
{
|
|
DWORD data_size = 4;
|
|
int data;
|
|
DWORD type = REG_DWORD;
|
|
ret = ::RegQueryValueEx(hKEY, L"AppliedDPI", NULL, &type, (LPBYTE)&data, &data_size);
|
|
if (ret != ERROR_SUCCESS)
|
|
{
|
|
::RegCloseKey(hKEY);
|
|
}
|
|
else
|
|
{
|
|
if (data > 0)
|
|
{
|
|
dpi_value = data;
|
|
}
|
|
::RegCloseKey(hKEY);
|
|
}
|
|
}
|
|
|
|
return dpi_value;
|
|
}
|
|
|
|
bool DpiManager::IsAdaptDPI()
|
|
{
|
|
if (m_bAdaptDPI)
|
|
return true;
|
|
|
|
if(IsWindowsVistaOrGreater()) {
|
|
PROCESS_DPI_AWARENESS awareness = PROCESS_DPI_UNAWARE;
|
|
bool bAware = false;
|
|
if (GetProcessDPIAwarenessWrapper(awareness)) {
|
|
m_bAdaptDPI = awareness != PROCESS_DPI_UNAWARE;
|
|
}
|
|
else if (IsProcessDPIAwareWrapper(bAware)) {
|
|
m_bAdaptDPI = bAware;
|
|
}
|
|
else{
|
|
m_bAdaptDPI = false;
|
|
}
|
|
}
|
|
|
|
return m_bAdaptDPI;
|
|
}
|
|
|
|
bool DpiManager::SetAdaptDPI()
|
|
{
|
|
if (m_bAdaptDPI)
|
|
return true;
|
|
|
|
if(IsWindowsVistaOrGreater()) {
|
|
if (SetProcessDPIAwarenessWrapper(PROCESS_PER_MONITOR_DPI_AWARE)) {
|
|
m_bAdaptDPI = true;
|
|
}
|
|
else if(SetProcessDPIAwareWrapper()){
|
|
m_bAdaptDPI = true;
|
|
}
|
|
else{
|
|
m_bAdaptDPI = false;
|
|
}
|
|
}
|
|
else {
|
|
m_bAdaptDPI = true;
|
|
}
|
|
|
|
return m_bAdaptDPI;
|
|
}
|
|
|
|
UINT DpiManager::GetScale()
|
|
{
|
|
if (!m_bAdaptDPI)
|
|
return 100;
|
|
|
|
return m_nScaleFactor;
|
|
}
|
|
|
|
void DpiManager::SetScale(UINT uDPI)
|
|
{
|
|
if (m_bAdaptDPI)
|
|
m_nScaleFactor = MulDiv(uDPI, 100, 96);
|
|
|
|
ASSERT(m_nScaleFactor >= 100);
|
|
}
|
|
|
|
int DpiManager::ScaleInt(int &iValue)
|
|
{
|
|
if (!m_bAdaptDPI || m_nScaleFactor == 100)
|
|
return iValue;
|
|
|
|
iValue = MulDiv(iValue, m_nScaleFactor, 100);
|
|
return iValue;
|
|
}
|
|
|
|
void DpiManager::ScaleSize(SIZE &size)
|
|
{
|
|
if (!m_bAdaptDPI || m_nScaleFactor == 100)
|
|
return;
|
|
|
|
size.cx = MulDiv(size.cx, m_nScaleFactor, 100);
|
|
size.cy = MulDiv(size.cy, m_nScaleFactor, 100);
|
|
}
|
|
|
|
void DpiManager::ScaleSize(CSize &size)
|
|
{
|
|
if (!m_bAdaptDPI || m_nScaleFactor == 100)
|
|
return;
|
|
|
|
size.cx = MulDiv(size.cx, m_nScaleFactor, 100);
|
|
size.cy = MulDiv(size.cy, m_nScaleFactor, 100);
|
|
}
|
|
|
|
void DpiManager::ScalePoint(POINT &point)
|
|
{
|
|
if (!m_bAdaptDPI || m_nScaleFactor == 100)
|
|
return;
|
|
|
|
point.x = MulDiv(point.x, m_nScaleFactor, 100);
|
|
point.y = MulDiv(point.y, m_nScaleFactor, 100);
|
|
}
|
|
|
|
|
|
void DpiManager::ScalePoint(CPoint &point)
|
|
{
|
|
if (!m_bAdaptDPI || m_nScaleFactor == 100)
|
|
return;
|
|
|
|
point.x = MulDiv(point.x, m_nScaleFactor, 100);
|
|
point.y = MulDiv(point.y, m_nScaleFactor, 100);
|
|
}
|
|
|
|
void DpiManager::ScaleRect(RECT &rect)
|
|
{
|
|
if (!m_bAdaptDPI || m_nScaleFactor == 100)
|
|
return;
|
|
|
|
int width = MulDiv(rect.right - rect.left, m_nScaleFactor, 100);
|
|
int height = MulDiv(rect.bottom - rect.top, m_nScaleFactor, 100);
|
|
rect.left = MulDiv(rect.left, m_nScaleFactor, 100);
|
|
rect.top = MulDiv(rect.top, m_nScaleFactor, 100);
|
|
rect.right = rect.left + width;
|
|
rect.bottom = rect.top + height;
|
|
}
|
|
|
|
void DpiManager::ScaleRect(UiRect &rect)
|
|
{
|
|
if (!m_bAdaptDPI || m_nScaleFactor == 100)
|
|
return;
|
|
|
|
int width = MulDiv(rect.right - rect.left, m_nScaleFactor, 100);
|
|
int height = MulDiv(rect.bottom - rect.top, m_nScaleFactor, 100);
|
|
rect.left = MulDiv(rect.left, m_nScaleFactor, 100);
|
|
rect.top = MulDiv(rect.top, m_nScaleFactor, 100);
|
|
rect.right = rect.left + width;
|
|
rect.bottom = rect.top + height;
|
|
}
|
|
|
|
} |