交流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); // 禁止表單中的繪製操作 ----- 14 frmChild2.Show( ); // 顯示表單等其他需要再顯示前做的事5 SendMessage(this.Handle, WM_SETDRAW, true, null); // 解除禁止繪製操作 ----- 26 RedrawWindow (this.Handle, IntPtr.Zero, IntPtr.Zero, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); // (0x04 | 0x01 | 0x80)立即強制重繪父表單及其所有子表單
幾乎可以全部顯示完整,達到了顯示要求。但是,滑鼠點擊切換子表單時,如果在表單切換沒有完成 (frmChild2未顯示出來frmChild1未消失時) 時再次點擊表單任意地區,就會啟用隱藏在父表單後的其他應用程式的表單,然後螢幕就花了,如果後面是記事本,滑鼠形狀就變成了輸入的形狀,父表單的、其他應用程式的,都顯示不完整,滑鼠移過的地方,其他應用程式的表單才顯示。
確定問題就在1與2之間,SendMessage函數使用的問題。想要的效果是:滑鼠在父表單任意地區點擊都只對當前表單有效,不會啟用後面的表單,也不會變成後面表單中滑鼠的形狀。