开发环境:
Visaul Studio 2008 - C#.Net问题描述:
MDI窗体,样子像Windows的Explorer资源管理器,侧边栏里的条目用于切换各个MDI子窗体,因显示时出现花屏现象(不能一次全部完整显示),曾采取如下方案进行优化:1、 把切换时动态创建、释放的窗体资源修改成全局的,用Form.Show()、Form.Hide()取代。
效果不明显。2、 使用Windows API 中的LockWindowUpdate与SendMessage函数:frmChild1.Hide( ); // 隐藏当前显示的子窗体LockWindowUpdate(this.Handle); // 锁定父窗体
frmChild2.Show( ); // 显示窗体等其他需要再显示前做的事
LockWindowUpdate (IntPtr.Zero); // 解锁父窗体
RedrawWindow (this.Handle, IntPtr.Zero, IntPtr.Zero, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); // 立即强制重绘父窗体及其所有子窗体效果好转,但人眼还能看到一些花屏现象,仍不能一次全部完整显示。3、 使用Windows API中的SendMessage函数: frmChild1.Hide( );SendMessage(this.Handle, WM_SETDRAW, false, null); // 禁止窗体中的绘制操作 ----- 1
frmChild2.Show( ); // 显示窗体等其他需要再显示前做的事
SendMessage(this.Handle, WM_SETDRAW, true, null); // 解除禁止绘制操作 ----- 2
RedrawWindow (this.Handle, IntPtr.Zero, IntPtr.Zero, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); // 立即强制重绘父窗体及其所有子窗体4、 几乎可以全部显示完整,达到了显示要求。但是,鼠标点击切换子窗体时,如果在窗体切换没有完成 (frmChild2未显示出来frmChild1未消失时) 时再次点击窗体任意区域,就会激活隐藏在父窗体后的其他应用程序的窗体,然后屏幕就花了,如果后面是记事本,鼠标形状就变成了输入的形状,父窗体的、其他应用程序的,都显示不完整,鼠标移过的地方,其他应用程序的窗体才显示。
确定问题就在1与2之间,SendMessage函数使用的问题。想要的效果是:鼠标在父窗体任意区域点击都只对当前窗体有效,不会激活后面的窗体,也不会变成后面窗体中鼠标的形状。
弄了好久了,。。希望能得到解决 谢~
Visaul Studio 2008 - C#.Net问题描述:
MDI窗体,样子像Windows的Explorer资源管理器,侧边栏里的条目用于切换各个MDI子窗体,因显示时出现花屏现象(不能一次全部完整显示),曾采取如下方案进行优化:1、 把切换时动态创建、释放的窗体资源修改成全局的,用Form.Show()、Form.Hide()取代。
效果不明显。2、 使用Windows API 中的LockWindowUpdate与SendMessage函数:frmChild1.Hide( ); // 隐藏当前显示的子窗体LockWindowUpdate(this.Handle); // 锁定父窗体
frmChild2.Show( ); // 显示窗体等其他需要再显示前做的事
LockWindowUpdate (IntPtr.Zero); // 解锁父窗体
RedrawWindow (this.Handle, IntPtr.Zero, IntPtr.Zero, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); // 立即强制重绘父窗体及其所有子窗体效果好转,但人眼还能看到一些花屏现象,仍不能一次全部完整显示。3、 使用Windows API中的SendMessage函数: frmChild1.Hide( );SendMessage(this.Handle, WM_SETDRAW, false, null); // 禁止窗体中的绘制操作 ----- 1
frmChild2.Show( ); // 显示窗体等其他需要再显示前做的事
SendMessage(this.Handle, WM_SETDRAW, true, null); // 解除禁止绘制操作 ----- 2
RedrawWindow (this.Handle, IntPtr.Zero, IntPtr.Zero, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); // 立即强制重绘父窗体及其所有子窗体4、 几乎可以全部显示完整,达到了显示要求。但是,鼠标点击切换子窗体时,如果在窗体切换没有完成 (frmChild2未显示出来frmChild1未消失时) 时再次点击窗体任意区域,就会激活隐藏在父窗体后的其他应用程序的窗体,然后屏幕就花了,如果后面是记事本,鼠标形状就变成了输入的形状,父窗体的、其他应用程序的,都显示不完整,鼠标移过的地方,其他应用程序的窗体才显示。
确定问题就在1与2之间,SendMessage函数使用的问题。想要的效果是:鼠标在父窗体任意区域点击都只对当前窗体有效,不会激活后面的窗体,也不会变成后面窗体中鼠标的形状。
弄了好久了,。。希望能得到解决 谢~
treeview中每项对应一个单独的单例窗体,
点击时清空panel,再将对应的窗体加进来并设为panel的子项
不要再放其它多的东西和过多的逻辑判断,
如果有且有必要,用异步在后台操作
鼠标点击切换子窗体时,如果在窗体切换没有完成 (frmChild2未显示出来frmChild1未消失时) 时再次点击窗体任意区域,就会激活隐藏在父窗体后的其他应用程序的窗体,然后屏幕就花了,如果后面是记事本,鼠标形状就变成了输入的形状,父窗体的、其他应用程序的,都显示不完整,鼠标移过的地方,其他应用程序的窗体才显示。
这个和我问题一样的,
http://topic.csdn.net/u/20091127/11/9b067481-7578-46ba-868d-d8d616d0ae41.html?seed=155608517&r=78439253#r_78439253
那我该怎么办呢?SendMessage(false)后怎么才能避免
鼠标点击时不会激活后面的窗口呢?
SendMessage函数中,送消息 WM_SETREDRAW,设置SETREDRAW为FALSE,导致窗口不进行绘制。
此时,看到的窗体是假的,鼠标形状是后面应用程序的形状;
鼠标划过,后面的应用程序就显示出来了。
人眼看到的就是“花屏”。
除非激活其他窗体把屏幕覆盖,才把“花”的地方清除,
或者直到 SETREDRAW设置为TRUE,然后RedrawWindow,LockWindowUpdate的效果不理想,SETREDRAW会出现“花屏”,
如何解决使用SETREDRAW带来的的花屏?????????
SendMessage函数中,送消息 WM_SETREDRAW,设置SETREDRAW为FALSE,导致窗口不进行绘制。
此时,看到的窗体是假的,现象:
鼠标形状是后面应用程序的形状;
鼠标划过,后面的应用程序就显示出来了。
人眼看到的就是“花屏”。
除非激活其他窗体把屏幕覆盖,才把“花”的地方清除,
或者直到 SETREDRAW设置为TRUE,然后RedrawWindow,[color=#0000FF]LockWindowUpdate的效果不理想,SETREDRAW会出现“花屏”,
如何解决使用SETREDRAW带来的的花屏?????????[/color]