win10 贴屏最大化 处理

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水迎朝阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值