【MFC】-003 限制窗口最大或最小尺寸

【MFC】-003 限制窗口最大或最小尺寸

1、由来

  MFC向导新建的程序的窗口尺寸是可以随意变化的,在实际应用过程中,可能需要限制窗口的最大尺寸或最小尺寸。

2、步骤

2.1 映射消息

  窗口最大或最小尺寸是由WM_GETMINMAXINFO消息进行控制的,因此,在需要控制窗口最大或最小尺寸的窗体中,需要对该消息进行映射。消息映射宏为ON_WM_GETMINMAXINFO,对应的消息响应函数为void OnGetMinMaxInfo(MINMAXINFO* lpMMI)

2.2 消息响应函数

void CImgProcDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYSCREEN);
    int nShellHight = 0;

    //获取任务栏
    CWnd* pTaskWnd = FindWindow(_T("Shell_TrayWnd"), NULL);

    if (pTaskWnd != NULL)
    {
        LONG lStyle = GetWindowLong(pTaskWnd->GetSafeHwnd(), GWL_STYLE);

        //如果任务栏存在且可见,要减去任务栏高度
        if (lStyle & WS_VISIBLE)
        {
            //任务栏可见 
            RECT TastRect;
            pTaskWnd->GetWindowRect(&TastRect); //任务栏的尺寸
            nShellHight = TastRect.bottom - TastRect.top;
        }
        else
        {
            //任务栏隐藏 不做处理
        }
    }

    cy -= nShellHight;

    lpMMI->ptMaxSize.x = cx;  // 设置窗口最大化时的宽度
    lpMMI->ptMaxSize.y = cy;  // 设置窗口最大化时的高度
    lpMMI->ptMaxPosition.x = 0; // 设置窗口最大化时x坐标
    lpMMI->ptMaxPosition.y = 0; // 设置窗口最大化时y坐标
    lpMMI->ptMinTrackSize.x = 1920*0.5; // 设置窗口最小宽度
    lpMMI->ptMinTrackSize.y = 1080*0.5; // 设置窗口最小高度
    lpMMI->ptMaxTrackSize.x = cx; // 设置窗口最大宽度
    lpMMI->ptMaxTrackSize.y = cy; // 设置窗口最大高度
    CDialogEx::OnGetMinMaxInfo(lpMMI);
}
;