解决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.
经过测试果然可以满足我的程序的要求,切换的时候再也不闪烁了.
以上只是在本人的程序中解决了闪烁的问题,不保存一定能解决其他的程序中的问题.
撰写此文以留给自己今后参考,如需使用,请自行测试其可用性.
这个问题网络上找了好多方法,但是大多都没有说的很清楚.
使用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.
经过测试果然可以满足我的程序的要求,切换的时候再也不闪烁了.
以上只是在本人的程序中解决了闪烁的问题,不保存一定能解决其他的程序中的问题.
撰写此文以留给自己今后参考,如需使用,请自行测试其可用性.
相关文章推荐
- 解决MDI窗体最大化状态小切换窗体时闪烁问题
- 地球,请你不要颤抖!----如何解决ArcGIS Globe视角模式切换产生抖动的问题
- 如何将电脑硬盘模式修改为ahci模式,并解决切换后的蓝屏问题
- 解决vs2008无法切换设计视图的问题
- 基于双缓冲技术解决视图刷新重绘闪烁问题
- 解决Datagridview虚拟模式下闪烁的问题
- [问题解决方案]解决vs2008无法切换设计视图问题
- 解决VS2008切换设计模式卡死问题
- 【C#】MDI父窗体嵌套子窗体 切换时闪屏问题解决办法
- vs2008 Web 页面切换设计视图无反应问题的解决
- MFC与openGL结合拖放窗口,视图闪烁问题解决
- 【Delphi】使用双缓冲解决图片切换时的闪烁问题
- 给MDI 父窗体添加背景和解决闪烁的问题。
- cmd模式下cd目录,文件夹命名有空格无法切换问题解决方法
- 解决VIM编辑中文文档 “编辑/命令” 模式输入法频繁切换问题
- symbian 传统模式下 应用程序中的视图切换问题
- 使用双缓冲解决图片切换时的闪烁问题
- 工厂模式加单例管理Fragment,同时解决fragment切换数据丢失问题
- Android 解决SurfaceView切换导致界面闪烁,短暂黑屏问题。
- 解决VS2008切换设计模式卡死问题