您的位置:首页 > 其它

MFC窗口变化消息( OnSize、OnSizing和OnGetMinMaxInfo)

2015-08-06 10:01 405 查看
(?)[+]

OnGetMinMaxInfo
这个函数在窗口初始化的时候会被调用一次当窗口大小发生改变的时候也会被调用利用这个函数可以比较方便的实现窗口最大最小尺寸的控制
参数lpMMI是一个结构体指针其中包含了有关窗口的最大化大小和位置以及最小最大跟踪大小的信息
使用这个函数控制窗口最小尺寸的示例的代码如下
以上代码可以使得窗口大小变化时最小宽度为500px最小高度为100px
OnSizing
这个函数在窗口大小发生变化时被调用在这个函数里也可以控制窗口的最大最小尺寸但是没有OnGetMinMaxInfo方便

OnSize
这个函数会在窗口大小改变结束后被调用通常会在这个函数里重新摆放各个控件的位置及大小用这个函数暂时没有找到什么办法可以控制窗口的最大最小大小

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

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

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


OnGetMinMaxInfo


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


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


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

[cpp]
view plaincopyprint?

void CXXXDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)

{
lpMMI->ptMinTrackSize.x = 500;
//x宽度
lpMMI->ptMinTrackSize.y = 100; //y高度

CDialog::OnGetMinMaxInfo(lpMMI);
}

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

CDialog::OnGetMinMaxInfo(lpMMI);
}



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


OnSizing


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

[cpp]
view plaincopyprint?

void CXXXDlg::OnSizing(UINT fwSide, LPRECT pRect)

{
if ((pRect->right - pRect->left) < 500)

{
//return ; //直接return是无效的,窗口大小还是会改变

pRect->right = pRect->left + 500;
}

CDialog::OnSizing(fwSide, pRect);
}

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


这个函数会在窗口大小改变结束后被调用,通常会在这个函数里重新摆放各个控件的位置及大小。用这个函数暂时没有找到什么办法可以控制窗口的最大最小大小。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: