窗口变化相关消息 OnSize、OnSizing和OnGetMinMaxInfo

最近用到窗口变化的一些东西,遇到几个相关的消息函数,简要分析,做为备忘。ide

3个消息分别是:WM_SIZE、WM_SIZING、WM_GETMINMAXINFO;分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。函数

当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。指针

OnGetMinMaxInfo

这个函数在窗口初始化的时候会被调用一次,当窗口大小发生改变的时候也会被调用。利用这个函数,能够比较方便的实现窗口最大最小尺寸的控制。方法

参数lpMMI是一个结构体指针,其中包含了有关窗口的最大化大小和位置以及最小、最大跟踪大小的信息。移动

使用这个函数控制窗口最小尺寸的示例的代码以下:di

void CXXXDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{
    lpMMI->ptMinTrackSize.x = 500;    //x宽度
    lpMMI->ptMinTrackSize.y = 100;    //y高度

    CDialog::OnGetMinMaxInfo(lpMMI);
}

以上代码能够使得窗口大小变化时,最小宽度为500px,最小高度为100px。block

OnSizing

这个函数在窗口大小发生变化时被调用。在这个函数里,也能够控制窗口的最大最小尺寸,可是没有OnGetMinMaxInfo方便。消息

void CXXXDlg::OnSizing(UINT fwSide, LPRECT pRect) 
{
    if ((pRect->right - pRect->left) < 500)
    {
        //return ;    //直接return是无效的,窗口大小仍是会改变
        pRect->right = pRect->left + 500;
    }

    CDialog::OnSizing(fwSide, pRect);
}

用上面的方法,若是是从右边改变大小,能够达到想要的效果,可是从左边改变大小,虽然大小能够控制在最小500,可是当达到最小宽度后,再缩小,会发现整个窗口往右移动了,缘由是代码中的pRect->right = pRect->left + 500;这句是针对left来改变right的,因此left移动了,right也移动了,看上去就像是这个窗口右移了。因此针对这种状况又要另外作相应的处理。结构体

OnSize

这个函数会在窗口大小改变结束后被调用,一般会在这个函数里从新摆放各个控件的位置及大小。用这个函数暂时没有找到什么办法能够控制窗口的最大最小大小。return

相关文章
相关标签/搜索