win10 贴屏最大化 处理

版权声明:www.gudianxiaoshuo.com (古典小说网) 今日头条号: 古典古韵古典小说、讨厌编程 https://blog.csdn.net/shuilan0066/article/details/87860325

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);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/shuilan0066/article/details/87860325