开发环境:
Visaul Studio 2008 - C#.Net
问题描述:
MDI窗体,样子像Windows的Explorer资源管理器,侧边栏里的条目用于切换各个MDI子窗体,因显示时出现花屏现象(不能一次全部完整显示),曾采取如下方案进行优化:
1. 把切换时动态创建、释放的窗体资源修改成全局的,用Form.Show()、Form.Hide()取代。
效果不明显。
2. 使用Windows API 中的LockWindowUpdate函数:
1 frmChild1.Hide( ); // 隐藏当前显示的子窗体 2 3 LockWindowUpdate(this.Handle); // 锁定父窗体 4 frmChild2.Show( ); // 显示窗体等其他需要再显示前做的事 5 LockWindowUpdate (IntPtr.Zero); // 解锁父窗体 6 RedrawWindow (this.Handle, IntPtr.Zero, IntPtr.Zero,
RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); // (0x04 | 0x01 | 0x80)立即强制重绘父窗体及其所有子窗体
效果好转,但人眼还能看到一些花屏现象,仍不能一次全部完整显示。
3. 使用Windows API中的SendMessage函数:
1 frmChild1.Hide( ); 2 3 SendMessage(this.Handle, WM_SETDRAW, false, null); // 禁止窗体中的绘制操作 ----- 1 4 frmChild2.Show( ); // 显示窗体等其他需要再显示前做的事 5 SendMessage(this.Handle, WM_SETDRAW, true, null); // 解除禁止绘制操作 ----- 2 6 RedrawWindow (this.Handle, IntPtr.Zero, IntPtr.Zero,
RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); // (0x04 | 0x01 | 0x80)立即强制重绘父窗体及其所有子窗体
几乎可以全部显示完整,达到了显示要求。但是,鼠标点击切换子窗体时,如果在窗体切换没有完成 (frmChild2未显示出来frmChild1未消失时) 时再次点击窗体任意区域,就会激活隐藏在父窗体后的其他应用程序的窗体,然后屏幕就花了,如果后面是记事本,鼠标形状就变成了输入的形状,父窗体的、其他应用程序的,都显示不完整,鼠标移过的地方,其他应用程序的窗体才显示。
确定问题就在1与2之间,SendMessage函数使用的问题。想要的效果是:鼠标在父窗体任意区域点击都只对当前窗体有效,不会激活后面的窗体,也不会变成后面窗体中鼠标的形状。
希望能得到解决。。。 谢~
为了阻止窗体中的绘制操作,我这样做的:
SendMessage函数中,发送消息 WM_SETREDRAW,设置SETREDRAW为FALSE,导致窗口不进行绘制。
此时,看到的窗体是假的,现象:
鼠标形状是后面应用程序的形状;
鼠标划过,后面的应用程序就显示出来了。
人眼看到的就是“花屏”。
除非用其他窗体把屏幕覆盖,才把“花”的地方清除,
或者直到 SETREDRAW设置为TRUE,然后RedrawWindow,
LockWindowUpdate的效果不理想,
SETREDRAW会出现“花屏”,
如何解决使用SETREDRAW带来的的花屏?????????
没办法了,弄不好了,很遗憾,先用LockWindowUpdate()吧,难受。。。
可以放到一個數組中,在初始化的時候,全部加載。
是的,像上面的优化方案一,但是效果不太好,
控制窗体显示 只显示当前要显示的窗体
嗯,MDI窗体中每次只显示一个子窗体,在父窗体中最大化,
@tjm_1990: 你的问题解决了么
@┢┦偉: 没呢,从去年就开始弄现在的这个界面显示速度优化,。。。项目都快超期了,
@tjm_1990: 鼠标在父窗体任意区域点击都只对当前窗体有效,不会激活后面的窗体,也不会变成后面窗体中鼠标的形状。
你修改一下click事件呗
@┢┦偉: 谢谢你!好像是使用SETREDRAW时出现的问题,
问题补充:
为了阻止窗体中的绘制操作,我这样做的:
SendMessage函数中,发送消息 WM_SETREDRAW,设置SETREDRAW为FALSE,导致窗口不进行绘制。
此时,看到的窗体是假的,现象:。。。(见“问题补充”)
还是没解决。。。