From 34933520aca5b20814b5c2734593cee971e949b6 Mon Sep 17 00:00:00 2001 From: binary1248 Date: Mon, 18 Aug 2014 19:02:40 +0200 Subject: [PATCH 1/2] Fixed Windows DPI scaling causing strange window behavior (#679). --- src/SFML/Window/Win32/WindowImplWin32.cpp | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index 3ee673eca..a086b1715 100644 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -57,6 +57,25 @@ namespace unsigned int windowCount = 0; const wchar_t* className = L"SFML_Window"; sf::priv::WindowImplWin32* fullscreenWindow = NULL; + + void setProcessDpiAware() + { + HINSTANCE user32Dll = LoadLibrary(L"user32.dll"); + + if (user32Dll) + { + typedef BOOL (WINAPI* SetProcessDPIAwareFuncType)(void); + SetProcessDPIAwareFuncType SetProcessDPIAwareFunc = GetProcAddress(user32Dll, "SetProcessDPIAware"); + + if (SetProcessDPIAwareFunc) + { + if (!SetProcessDPIAwareFunc()) + sf::err() << "Failed to set process DPI awareness" << std::endl; + } + + FreeLibrary(user32Dll); + } + } } namespace sf @@ -75,6 +94,9 @@ m_resizing (false), m_surrogate (0), m_mouseInside (false) { + // Set that this process is DPI aware and can handle DPI scaling + setProcessDpiAware(); + if (m_handle) { // We change the event procedure of the control (it is important to save the old one) @@ -96,6 +118,9 @@ m_resizing (false), m_surrogate (0), m_mouseInside (false) { + // Set that this process is DPI aware and can handle DPI scaling + setProcessDpiAware(); + // Register the window class at first call if (windowCount == 0) registerWindowClass(); From f9ed3fdcb34bf902e53d7a5f75b0481044538f90 Mon Sep 17 00:00:00 2001 From: binary1248 Date: Tue, 19 Aug 2014 17:39:01 +0200 Subject: [PATCH 2/2] Added support for SetProcessDpiAwareness as well, on Windows versions that support it. --- src/SFML/Window/Win32/WindowImplWin32.cpp | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/SFML/Window/Win32/WindowImplWin32.cpp b/src/SFML/Window/Win32/WindowImplWin32.cpp index a086b1715..10c9245c0 100644 --- a/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -60,6 +60,42 @@ namespace void setProcessDpiAware() { + // Try SetProcessDpiAwareness first + HINSTANCE shCoreDll = LoadLibrary(L"Shcore.dll"); + + if (shCoreDll) + { + enum ProcessDpiAwareness + { + ProcessDpiUnaware = 0, + ProcessSystemDpiAware = 1, + ProcessPerMonitorDpiAware = 2 + }; + + typedef HRESULT (WINAPI* SetProcessDpiAwarenessFuncType)(ProcessDpiAwareness); + SetProcessDpiAwarenessFuncType SetProcessDpiAwarenessFunc = reinterpret_cast(GetProcAddress(shCoreDll, "SetProcessDpiAwareness")); + + if (SetProcessDpiAwarenessFunc) + { + // We only check for E_INVALIDARG because we would get + // E_ACCESSDENIED if the DPI was already set previously + // and S_OK means the call was successful + if (SetProcessDpiAwarenessFunc(ProcessSystemDpiAware) == E_INVALIDARG) + { + sf::err() << "Failed to set process DPI awareness" << std::endl; + } + else + { + FreeLibrary(shCoreDll); + return; + } + } + + FreeLibrary(shCoreDll); + } + + // Fall back to SetProcessDPIAware if SetProcessDpiAwareness + // is not available on this system HINSTANCE user32Dll = LoadLibrary(L"user32.dll"); if (user32Dll)