supported High-DPI
This commit is contained in:
parent
c1a4276533
commit
bb671a9674
@ -10,6 +10,8 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
#define PROP_DPIISOLATION L"PROP_ISOLATION"
|
||||||
|
|
||||||
static KeyboardButton KeyConvert[256];
|
static KeyboardButton KeyConvert[256];
|
||||||
static void (*WMProc[2048])(WinWindow *,uint32,uint32); //消息处理队列
|
static void (*WMProc[2048])(WinWindow *,uint32,uint32); //消息处理队列
|
||||||
|
|
||||||
@ -190,6 +192,65 @@ namespace hgl
|
|||||||
return KeyConvert[key];
|
return KeyConvert[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WMProcNCCreate(WinWindow *win,uint32 wParam,uint32 lParam)
|
||||||
|
{
|
||||||
|
auto createStruct = reinterpret_cast<const CREATESTRUCTW *>(lParam);
|
||||||
|
auto createParams = static_cast<const WindowCreateExteraParams *>(createStruct->lpCreateParams);
|
||||||
|
|
||||||
|
if (createParams->bEnableNonClientDpiScaling)
|
||||||
|
{
|
||||||
|
EnableNonClientDpiScaling(win->GetWnd());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store a flag on the window to note that it'll run its child in a different awareness
|
||||||
|
if (createParams->bChildWindowDpiIsolation)
|
||||||
|
{
|
||||||
|
SetPropW(win->GetWnd(), PROP_DPIISOLATION, (HANDLE)TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WMProcCreate(WinWindow *win,uint32 wParam,uint32 lParam)
|
||||||
|
{
|
||||||
|
HWND hWnd=win->GetWnd();
|
||||||
|
RECT rcWindow = {};
|
||||||
|
UINT uDpi = 96;
|
||||||
|
DPI_AWARENESS dpiAwareness = GetAwarenessFromDpiAwarenessContext(GetThreadDpiAwarenessContext());
|
||||||
|
|
||||||
|
switch (dpiAwareness)
|
||||||
|
{
|
||||||
|
// Scale the window to the system DPI
|
||||||
|
case DPI_AWARENESS_SYSTEM_AWARE:
|
||||||
|
uDpi = GetDpiForSystem();
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Scale the window to the monitor DPI
|
||||||
|
case DPI_AWARENESS_PER_MONITOR_AWARE:
|
||||||
|
uDpi = GetDpiForWindow(hWnd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
GetWindowRect(hWnd, &rcWindow);
|
||||||
|
rcWindow.right = rcWindow.left + MulDiv(win->GetWidth(), uDpi, 96);
|
||||||
|
rcWindow.bottom = rcWindow.top + MulDiv(win->GetHeight(), uDpi, 96);
|
||||||
|
SetWindowPos(hWnd, nullptr, rcWindow.right, rcWindow.top, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top, SWP_NOZORDER | SWP_NOACTIVATE);
|
||||||
|
|
||||||
|
BOOL bDpiIsolation = PtrToInt(GetPropW(hWnd, PROP_DPIISOLATION));
|
||||||
|
|
||||||
|
DPI_AWARENESS_CONTEXT previousDpiContext = {};
|
||||||
|
DPI_HOSTING_BEHAVIOR previousDpiHostingBehavior = {};
|
||||||
|
|
||||||
|
if (bDpiIsolation)
|
||||||
|
{
|
||||||
|
previousDpiHostingBehavior = SetThreadDpiHostingBehavior(DPI_HOSTING_BEHAVIOR_MIXED);
|
||||||
|
|
||||||
|
// For this example, we'll have the external content run with System-DPI awareness
|
||||||
|
previousDpiContext = SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE);
|
||||||
|
|
||||||
|
SetThreadDpiAwarenessContext(previousDpiContext);
|
||||||
|
SetThreadDpiHostingBehavior(previousDpiHostingBehavior);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void WMProcDestroy(WinWindow *win,uint32,uint32)
|
void WMProcDestroy(WinWindow *win,uint32,uint32)
|
||||||
{
|
{
|
||||||
win->ProcClose();
|
win->ProcClose();
|
||||||
@ -282,6 +343,8 @@ namespace hgl
|
|||||||
|
|
||||||
#define WM_MAP(wm,func) WMProc[wm]=func;
|
#define WM_MAP(wm,func) WMProc[wm]=func;
|
||||||
|
|
||||||
|
WM_MAP(WM_NCCREATE ,WMProcNCCreate);
|
||||||
|
WM_MAP(WM_CREATE ,WMProcCreate);
|
||||||
WM_MAP(WM_CLOSE ,WMProcDestroy);
|
WM_MAP(WM_CLOSE ,WMProcDestroy);
|
||||||
WM_MAP(WM_LBUTTONDOWN ,WMProcMouseLeftPressed);
|
WM_MAP(WM_LBUTTONDOWN ,WMProcMouseLeftPressed);
|
||||||
WM_MAP(WM_LBUTTONUP ,WMProcMouseLeftReleased);
|
WM_MAP(WM_LBUTTONUP ,WMProcMouseLeftReleased);
|
||||||
|
@ -63,6 +63,18 @@ namespace hgl
|
|||||||
win_top = CW_USEDEFAULT;
|
win_top = CW_USEDEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WindowCreateExteraParams createParams;
|
||||||
|
|
||||||
|
{
|
||||||
|
context = DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2;
|
||||||
|
previousDpiContext = SetThreadDpiAwarenessContext(context);
|
||||||
|
|
||||||
|
createParams.bEnableNonClientDpiScaling = FALSE;
|
||||||
|
createParams.bChildWindowDpiIsolation = TRUE;
|
||||||
|
|
||||||
|
previousDpiHostingBehavior = SetThreadDpiHostingBehavior(DPI_HOSTING_BEHAVIOR_MIXED);
|
||||||
|
}
|
||||||
|
|
||||||
win_hwnd = CreateWindowExW(0,
|
win_hwnd = CreateWindowExW(0,
|
||||||
WIN_CLASS_NAME, // class name
|
WIN_CLASS_NAME, // class name
|
||||||
win_name.c_str(), // app name
|
win_name.c_str(), // app name
|
||||||
@ -73,7 +85,7 @@ namespace hgl
|
|||||||
nullptr, // handle to parent
|
nullptr, // handle to parent
|
||||||
nullptr, // handle to menu
|
nullptr, // handle to menu
|
||||||
hInstance, // hInstance
|
hInstance, // hInstance
|
||||||
nullptr); // no extra parameters
|
&createParams); // extra parameters
|
||||||
|
|
||||||
if (!win_hwnd)
|
if (!win_hwnd)
|
||||||
{
|
{
|
||||||
@ -149,6 +161,10 @@ namespace hgl
|
|||||||
void WinWindow::Show()
|
void WinWindow::Show()
|
||||||
{
|
{
|
||||||
ShowWindow(win_hwnd, SW_SHOW);
|
ShowWindow(win_hwnd, SW_SHOW);
|
||||||
|
|
||||||
|
SetThreadDpiAwarenessContext(previousDpiContext);
|
||||||
|
SetThreadDpiHostingBehavior(previousDpiHostingBehavior);
|
||||||
|
|
||||||
SetForegroundWindow(win_hwnd);
|
SetForegroundWindow(win_hwnd);
|
||||||
SetFocus(win_hwnd);
|
SetFocus(win_hwnd);
|
||||||
|
|
||||||
|
@ -3,6 +3,12 @@
|
|||||||
#include<Windows.h>
|
#include<Windows.h>
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
|
struct WindowCreateExteraParams
|
||||||
|
{
|
||||||
|
BOOL bEnableNonClientDpiScaling;
|
||||||
|
BOOL bChildWindowDpiIsolation;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Windows平台窗口实现
|
* Windows平台窗口实现
|
||||||
*/
|
*/
|
||||||
@ -14,6 +20,12 @@ namespace hgl
|
|||||||
|
|
||||||
MSG win_msg;
|
MSG win_msg;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
DPI_AWARENESS_CONTEXT context;
|
||||||
|
DPI_AWARENESS_CONTEXT previousDpiContext;
|
||||||
|
DPI_HOSTING_BEHAVIOR previousDpiHostingBehavior;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
bool Create();
|
bool Create();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user