aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorZufu Liu <unknown>2020-06-06 13:36:36 +1000
committerZufu Liu <unknown>2020-06-06 13:36:36 +1000
commit1be0995e0ee4ec69426ae908ae8d05603dfaa905 (patch)
tree870763354b9a329cef61b0423b6f709a53da2691
parent68db18e2b8e0217b2651e5e6f75051c1aa1564f9 (diff)
downloadscintilla-mirror-1be0995e0ee4ec69426ae908ae8d05603dfaa905.tar.gz
Bug [#2063]. On Windows 8.1 where GetDpiForWindow is not available, use
GetDpiForMonitor to emulate it.
-rw-r--r--win32/PlatWin.cxx23
1 files changed, 23 insertions, 0 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index 99885e5e4..60bdbfee6 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -251,6 +251,10 @@ UINT uSystemDPI = USER_DEFAULT_SCREEN_DPI;
using GetDpiForWindowSig = UINT(WINAPI *)(HWND hwnd);
GetDpiForWindowSig fnGetDpiForWindow = nullptr;
+HMODULE hDLLShcore {};
+using GetDpiForMonitorSig = HRESULT (WINAPI *)(HMONITOR hmonitor, /*MONITOR_DPI_TYPE*/int dpiType, UINT *dpiX, UINT *dpiY);
+GetDpiForMonitorSig fnGetDpiForMonitor = nullptr;
+
using GetSystemMetricsForDpiSig = int(WINAPI *)(int nIndex, UINT dpi);
GetSystemMetricsForDpiSig fnGetSystemMetricsForDpi = nullptr;
@@ -272,6 +276,13 @@ void LoadDpiForWindow() noexcept {
uSystemDPI = ::GetDeviceCaps(hdcMeasure, LOGPIXELSY);
::DeleteDC(hdcMeasure);
}
+
+ if (!fnGetDpiForWindow) {
+ hDLLShcore = ::LoadLibraryExW(L"shcore.dll", {}, LOAD_LIBRARY_SEARCH_SYSTEM32);
+ if (hDLLShcore) {
+ fnGetDpiForMonitor = DLLFunction<GetDpiForMonitorSig>(hDLLShcore, "GetDpiForMonitor");
+ }
+ }
}
HINSTANCE hinstPlatformRes {};
@@ -448,6 +459,14 @@ UINT DpiForWindow(WindowID wid) noexcept {
if (fnGetDpiForWindow) {
return fnGetDpiForWindow(HwndFromWindowID(wid));
}
+ if (fnGetDpiForMonitor) {
+ HMONITOR hMonitor = ::MonitorFromWindow(HwndFromWindowID(wid), MONITOR_DEFAULTTONEAREST);
+ UINT dpiX = 0;
+ UINT dpiY = 0;
+ if (fnGetDpiForMonitor(hMonitor, 0 /*MDT_EFFECTIVE_DPI*/, &dpiX, &dpiY) == S_OK) {
+ return dpiY;
+ }
+ }
return uSystemDPI;
}
@@ -3413,6 +3432,10 @@ void Platform_Finalise(bool fromDllMain) {
}
}
#endif
+ if (!fromDllMain && hDLLShcore) {
+ FreeLibrary(hDLLShcore);
+ hDLLShcore = {};
+ }
ListBoxX_Unregister();
}