Delphi解决点击主屏左侧图片按钮图片闪烁厉害的问题。

交流QQ:2609715119

加上锁屏控制就会好点:

   lockwindowupdate(form1.handle);
  Notebook1.ActivePage := '3';
  lockwindowupdate(0); 

Delphi解决点击主屏左侧图片按钮图片闪烁厉害的问题。

 在主窗口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函数: 

Delphi解决点击主屏左侧图片按钮图片闪烁厉害的问题。
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)立即强制重绘父窗体及其所有子窗体
Delphi解决点击主屏左侧图片按钮图片闪烁厉害的问题。

几乎可以全部显示完整,达到了显示要求。但是,鼠标点击切换子窗体时,如果在窗体切换没有完成 (frmChild2未显示出来frmChild1未消失时) 时再次点击窗体任意区域,就会**隐藏在父窗体后的其他应用程序的窗体,然后屏幕就花了,如果后面是记事本,鼠标形状就变成了输入的形状,父窗体的、其他应用程序的,都显示不完整,鼠标移过的地方,其他应用程序的窗体才显示。 

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