在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
交流QQ:2609715119 加上锁屏控制就会好点: lockwindowupdate(form1.handle);
Notebook1.ActivePage := '3'; lockwindowupdate(0); 在主窗口resize 事件里开头和结尾加上:
SendMessage(Form1.Handle, RDW_INVALIDATE + RDW_ALLCHILDREN + RDW_NOINTERNALPAINT + WM_SETREDRAW, 0, 0); 中间是控制控件位置的代码行 SendMessage(Form1.Handle, RDW_INVALIDATE + RDW_ALLCHILDREN + RDW_NOINTERNALPAINT + WM_SETREDRAW, 1, 0); 代码含义解释:
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函数使用的问题。想要的效果是:鼠标在父窗体任意区域点击都只对当前窗体有效,不会**后面的窗体,也不会变成后面窗体中鼠标的形状。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论