首页 新闻 会员 周边 捐助

窗体一次全部完整显示

0
悬赏园豆:100 [已解决问题] 解决于 2012-05-14 20:00

开发环境:
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未消失时) 时再次点击窗体任意区域,就会激活隐藏在父窗体后的其他应用程序的窗体,然后屏幕就花了,如果后面是记事本,鼠标形状就变成了输入的形状,父窗体的、其他应用程序的,都显示不完整,鼠标移过的地方,其他应用程序的窗体才显示。 

确定问题就在12之间,SendMessage函数使用的问题。想要的效果是:鼠标在父窗体任意区域点击都只对当前窗体有效,不会激活后面的窗体,也不会变成后面窗体中鼠标的形状。

 

 

 

 

 

希望能得到解决。。。 谢~

问题补充:

为了阻止窗体中的绘制操作,我这样做的:
SendMessage函数中,发送消息 WM_SETREDRAW设置SETREDRAW为FALSE,导致窗口不进行绘制。
此时,看到的窗体是假的,现象:

鼠标形状是后面应用程序的形状
鼠标划过,后面的应用程序就显示出来了
人眼看到的就是“花屏”。
除非用其他窗体把屏幕覆盖,才把“花”的地方清除,
或者直到 SETREDRAW设置为TRUE,然后RedrawWindow

LockWindowUpdate的效果不理想,

SETREDRAW会出现“花屏”,
如何解决使用SETREDRAW带来的的花屏?????????

goooogs的主页 goooogs | 初学一级 | 园豆:64
提问于:2012-04-28 10:49
< >
分享
最佳答案
0

没办法了,弄不好了,很遗憾,先用LockWindowUpdate()吧,难受。。。

goooogs | 初学一级 |园豆:64 | 2012-05-14 19:56
其他回答(2)
0

可以放到一個數組中,在初始化的時候,全部加載。

收获园豆:40
無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-28 10:55

是的,像上面的优化方案一,但是效果不太好,

支持(0) 反对(0) goooogs | 园豆:64 (初学一级) | 2012-05-02 20:38
0

控制窗体显示   只显示当前要显示的窗体

收获园豆:60
┢┦偉 | 园豆:1240 (小虾三级) | 2012-04-28 21:22

嗯,MDI窗体中每次只显示一个子窗体,在父窗体中最大化,

支持(0) 反对(0) goooogs | 园豆:64 (初学一级) | 2012-05-02 20:39

@tjm_1990: 你的问题解决了么

支持(0) 反对(0) ┢┦偉 | 园豆:1240 (小虾三级) | 2012-05-03 11:12

@┢┦偉: 没呢,从去年就开始弄现在的这个界面显示速度优化,。。。项目都快超期了,

支持(0) 反对(0) goooogs | 园豆:64 (初学一级) | 2012-05-03 14:51

@tjm_1990: 鼠标在父窗体任意区域点击都只对当前窗体有效,不会激活后面的窗体,也不会变成后面窗体中鼠标的形状。

 

你修改一下click事件呗

支持(0) 反对(0) ┢┦偉 | 园豆:1240 (小虾三级) | 2012-05-03 15:05

@┢┦偉: 谢谢你!好像是使用SETREDRAW时出现的问题,

问题补充:
为了阻止窗体中的绘制操作,我这样做的:
SendMessage函数中,发送消息 WM_SETREDRAW,设置SETREDRAW为FALSE,导致窗口不进行绘制。
此时,看到的窗体是假的,现象:。。。(见“问题补充”)

还是没解决。。。

支持(0) 反对(0) goooogs | 园豆:64 (初学一级) | 2012-05-03 22:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册