1、解决适配高DPI,导致UI无法只适应。
设置SetProcessDPIAware API告诉系统本进程是DPI感知会自适配DPI变化,系统不会对本进程创建的窗口进行自动放大。
HINSTANCE hUser32 = LoadLibrary(_T("user32.dll"));
if (hUser32)
{
typedef BOOL(WINAPI* LPSetProcessDPIAware)(void);
LPSetProcessDPIAware pSetProcessDPIAware = (LPSetProcessDPIAware)GetProcAddress(hUser32, "SetProcessDPIAware");
if (pSetProcessDPIAware)
{
pSetProcessDPIAware();
}
FreeLibrary(hUser32);
}
2、设置当前窗口焦点,置前。
HWND hwnd = FindWindow(_T("OsrWindow"), NULL);
::SetFocus(hwnd);
::SetForegroundWindow(hwnd);
3、禁止和启动当前窗口。
HWND hwnd = FindWindow(_T("OsrWindow"), NULL);
::EnableWindow(hwnd, FALSE); 启用:TRUE
4、WS_CLIPCHILDREN和WS_CLIPSIBLINGS。
WS_CLIPCHILDREN:主要是用于父窗口,也就是说当在父窗口绘制的时候,父窗口上还有一个子窗口,那么设置了这个样式的话,子窗口区域父窗口就不负责绘制。
WS_CLIPSIBLINGS:子窗口间相互裁减。也就是说当两个窗口相互重叠时,设置了WS_CLIPSIBLINGS样式的子窗口重绘时不能绘制被重叠的部分。
//子窗模式,解决重绘导致的问题,应用于CEF子窗模式。
HWND hWnd = CreateWindow(
m_wstrWndName.c_str(),
_T(""),
WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
0,
0,
800,
800,
GetWindow()->GetHWND(),
NULL,
hInstance,
this);