在开发过程中,有一个需求是窗口可以调节大小。但是有最大和最小区间。而Win11有一个贴靠布局功能,这会导致窗口大小突破限制。所以我们需要拦截Win11的贴靠布局。在网上搜索了一番没有找到禁用方式,所以只能用过窗口尺寸改变的时候拦截了,一开始笔者找的是WM_SIZING,但是测试了一下发现贴靠布局不会走这个消息。经过测试此时会走WM_WINDOWPOSCHANGING消息。所以我们将拦截代码写在该消息下即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void xxxxx::OnWindowPosChanging(LPWINDOWPOS lpWndPos)
{
SetMsgHandled(FALSE);
// 判断是否超出最大限度
if (lpWndPos->cx > m_sizeMax.cx lpWndPos->cy > m_sizeMax.cy)
{
lpWndPos->cx = m_sizeMax.cx;
lpWndPos->cy = m_sizeMax.cy;
return;
}
// 判断是否允许改变尺寸
if (m_isCanResize)
{
return;
}
// 不允许则设置回最大值
lpWndPos->cx = m_sizeMax.cx;
lpWndPos->cy = m_sizeMax.cy;
}