主题:关于窗口最大化时,窗口四边小部分被隐藏的问题

admin 2018年12月08日 70

windows系统下的窗口,如果窗口风格指定为WS_OVERLAPPED,窗口最大化最小化会有过度动画,最大化的时候窗口大小固定会向屏幕外扩展8个点。

之所以这样处理就是为了能够更好的利用屏幕显示可见内容,而不是显示不需要的边框,而且这个8个点的大小是固定的,目前为止我没有找到方法修改。

但是如果风格指定为WS_POPUP,这个扩展值默认是0,而且会在 WM_GETMINMAXINFO这个消息中允许用户调节。 

参考:


void SHostWnd::OnGetMinMaxInfo(LPMINMAXINFO lpMMI)
{
    HMONITOR hMonitor = ::MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONULL);

    if (hMonitor)
    {
        MONITORINFO mi = {sizeof(MONITORINFO)};
        ::GetMonitorInfo(hMonitor, &mi);

        CRect rcWork = mi.rcWork, rcMonitor = mi.rcMonitor;
                CRect rcMaxInset = m_hostAttr.GetMaxInset(GetScale());
        lpMMI->ptMaxPosition.x = abs(rcWork.left - rcMonitor.left) - rcMaxInset.left;
        lpMMI->ptMaxPosition.y = abs(rcWork.top - rcMonitor.top) - rcMaxInset.top;
        lpMMI->ptMaxSize.x = abs(rcWork.Width())+ rcMaxInset.right + rcMaxInset.left;
        lpMMI->ptMaxSize.y = abs(rcWork.Height())  + rcMaxInset.bottom + rcMaxInset.top;
        lpMMI->ptMaxTrackSize.x = abs(rcWork.Width())  + rcMaxInset.right + rcMaxInset.left;
        lpMMI->ptMaxTrackSize.y = abs(rcWork.Height())  + rcMaxInset.bottom + rcMaxInset.top;
                CSize szMin = m_hostAttr.GetMinSize(GetScale());
        lpMMI->ptMinTrackSize = CPoint(szMin.cx, szMin.cy);
    }
}

m_hostAttr.GetMaxInset(GetScale());是获取soui节点里的maxInset属性。