win10,将软件拖到最顶部后,会自动最大化。
但是项目中,需要取消这个功能,或自定义最大化界面
具体要求如下: 点击最大化后,两个窗口一左一右最大化处理
如果,不对贴屏处理的话,将一个窗口贴屏后,会挤掉另一个窗口,因此需要对其进行额外处理。
贴屏消息
贴屏后,系统自动将其最大化,然后会发出wm_size消息,参数为size_maximized,
我们在此,处理这个消息,判断是否为贴屏,如果是贴屏产生的最大化,则做还原处理,否则,如果是点击最大化按钮产生的最大化,则自定义最大化处理。
贴屏处理
1) 为此,定义一个变量 m_bClickedMax,用以判断是否为点击的自定义放大,定义一个矩形RECT,用以保存放大前的矩形位置,以便还原
else if (name == L"my_maxbtn" || name == L"my_restorebtn")
{
if (BDoubleVideo())
{
DWORD style = GetWindowLong(m_hWnd, GWL_STYLE);
if (style & WS_MAXIMIZE)
{
//还原窗口
::ShowWindow(m_hWnd, SW_RESTORE);
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
int nMaxHeight = cy - nWorkBarHeight;
nCefWidth = 800;
if (m_RC.right > m_RC.left&&m_RC.bottom > m_RC.top)
{
MoveWindow(m_hWnd, m_RC.left, m_RC.top, m_RC.right - m_RC.left, m_RC.bottom - m_RC.top, FALSE);
}
else{
MoveWindow(m_hWnd, cx - m_nSWidth - 10, (nMaxHeight - m_nSHeight) / 2, m_nSWidth, m_nSHeight, FALSE);
}
ReSetPos();
}
else
{
//自定义放大
//记录当前的宽度,高度,矩形 以便还原处理
m_bClickedMax = TRUE;
GetWindowRect(m_hWnd, &m_RC);
m_nSWidth = m_RC.right - m_RC.left;
m_nSHeight = m_RC.bottom - m_RC.top;
OnWndSizeMax(true);
}
}
2 )在wm_size中,判断是否为贴屏,分别处理
else if (uMsg == WM_SIZE)
{
if (wParam == SIZE_RESTORED)
OnWndSizeMax(false);
else if (wParam == SIZE_MAXIMIZED)
OnWndSizeMax(true);
ReSetPos();
}
void CefNativeForm::OnWndSizeMax(bool max)
{
if (!m_pRoot)
return;
FindControl(L"my_maxbtn")->SetVisible(!max);
FindControl(L"my_restorebtn")->SetVisible(max);
if (max)//贴屏最大化
{
CustomMax();
}
}
CustomMax(){
if (BDoubleVideo())
{
if (m_bClickedMax) //正常点击最大化按钮 自定义最大化
{
m_bClickedMax = FALSE;
//最大化窗口
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
int nMaxHeight = cy - nWorkBarHeight;
int nWidth = m_nSWidth;
MoveWindow(m_hWnd, cx - nWidth, 0, nWidth, nMaxHeight, FALSE);
DWORD style = GetWindowLong(m_hWnd, GWL_STYLE);
style = style | WS_MAXIMIZE;
SetWindowLong(m_hWnd, GWL_STYLE, style);
nCefWidth = cx - nWidth;
if (pReSetPositionCB)
{
pReSetPositionCB(0, 0, nCefWidth, nMaxHeight);
}
}
else{
//贴屏所致,还原,将系统默认的最大化处理,还原掉
::ShowWindow(m_hWnd, SW_RESTORE);
}
}
}