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

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