您的位置:首页 > 其它

解决MDI模式下切换视图时闪烁的问题

2010-03-04 09:20 309 查看
在MDI模式下,如果有多个视图存在,在切换不同视图时,会发现有一个明显的窗口有restore变为最大化的过程.我暂且叫他闪烁.

这个问题网络上找了好多方法,但是大多都没有说的很清楚.

使用MDIMaximize()函数在Onsize函数里面最大化视图,但是在切换几次以后,OnSize函数可能不再被执行,因为框架认为视图窗口的

大小已经是最大的了,不需要改变.但是如果最大化和还原几次程序以后,导致有些非激活视图在切换到激活视图时不能改变大小的问题

不知道是我的程序的原因,还是本身MDI程序的原因.

经过多次的尝试,我找到了MDI程序在激活一个视图时的函数调用顺序:(主要说明两个函数)

1,在激活一个视图时,首先调用处在当前激活状态的视图(就是需要隐藏掉的)的CChildFrame::OnMDIActivate()函数.

然后调用需要激活视图(就是需要显示出来)的CChildFrame::OnSize()函数改变大小.紧接着调用当前激活视图的

CChildFrame::OnSize()函数改变当前激活视图的大小(问题就在这里,程序会把要隐藏的窗口的大小变成restore状态下的大小).

最后调用需要激活视图的CChildFrame::OnMDIActivate()函数激活视图显示.

2,根据以上的步骤,我设想能不能在最后激活需要显示视图的时候把隐藏掉的视图的大小改变成主框架窗口的大小,就是使他在非激活状态也是

最大化的.所以我在激活视图的CChildFrame::OnMDIActivate()(就是1里面说的最后一步)函数里面加入下面的代码

if ((NULL != pDeactivateWnd)
&&(::IsWindow(pDeactivateWnd->m_hWnd))
&&((NULL != pActivateWnd)
&&(m_hWnd == pActivateWnd->m_hWnd)))
{
RECT rect = {0};
GetParentFrame()->GetClientRect(&rect);
pDeactivateWnd->MoveWindow(&rect,TRUE);
}

if 判定里面保证非激活视图存在(NULL != pDeactivateWnd),并且是需要激活的视图

调用OnMDIActivate()函数时m_hWnd == pActivateWnd->m_hWnd.

经过测试果然可以满足我的程序的要求,切换的时候再也不闪烁了.

以上只是在本人的程序中解决了闪烁的问题,不保存一定能解决其他的程序中的问题.

撰写此文以留给自己今后参考,如需使用,请自行测试其可用性.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: