日期:2014-05-18  浏览次数:21302 次

c# winform程序 窗口切换 乱闪 怎么解决
c# winform程序 窗口切换 乱闪 怎么解决
我的窗口控件比较多

网上查的方法都没有效果啊。
方法一: 没什么效果
如果说是防止加载了大图片闪烁的话,楼主不妨使用双缓冲的方式。PAINT事件里写上:
  SetStyle(ControlStyles.UserPaint, true);
  SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
  SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲

方法二:阻止重绘和恢复重绘。 
具体点

[DllImport("User32.dll", CharSet=CharSet.Auto, SetLastError=true)] 
  internalstaticexternint SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);

//开始对控件操作

禁止重绘:SendMessage(禁止重绘的控件.Handle, 11, 0, 0);
//对控件的操作过程

恢复重绘:SendMessage(恢复重绘的控件.Handle, 11, -1, 0);

 这个方法不知道怎么用啊??








这是我的程序 窗口切换 方法:

 #region 窗体切换 函数
  /// <summary>
  /// 窗体切换 函数
  /// </summary>
  /// <param name="f"></param>
  public void TurnFormVisible(Form f)
  {
  frmPEDestal.Visible = false;//台座信息
  frmNUMRules.Visible = false; //节段编号规则
  frmDESignLine.Visible = false;//线形设计-总体情况
  frmCENterline.Visible = false;//设计线形 平曲线 竖曲线
  frmSEGmentDefinition.Visible = false;//节段定义
  frmSEGmentInformation.Visible = false;//节段信息
  frmCHAinStructure.Visible = false;//链式结构
  frmJOIntCross.Visible = false;//联跨
  f.Visible = true;

  f.TopLevel = false; // 不是最顶层窗体
  pnlEmbed.Controls.Add(f); // 添加到 Panel中
  f.Show(); // 显示
  f.Dock = DockStyle.Fill;
  }
  #endregion

------解决方案--------------------
你换个思路,合理调整窗口布局怎样
------解决方案--------------------
判断一下窗体是否被激活,如果A要激活,遍历重绘A窗体的控件,禁止B的所有控件重绘,反之一样.
------解决方案--------------------
这需要使用Invoke
------解决方案--------------------
我也遇到这种情况,那是因为窗体中的控件比较多所导致的,尤其是Panl多,这样刷新的时候不同步导致会闪烁,楼主可以调整小界面元素的数量,最好可以简化一些控件,如果有需要可以使用GDI+自己画!!!
------解决方案--------------------
有效的办法就是像8楼朋友说的

1.减小form上控件的数量
2.不要将控件的背景设为透明

这是 winform 的劣根性,改不了的,所以现在都换 wpf 了,手机开发用 silverlight
------解决方案--------------------
f.Show();
f.Dock = DockStyle.Fill;

以上两句话的位置换一下试试呢?一般来说,Show 是放到最后的。
------解决方案--------------------
是不是在 Load中用了太多方法了
------解决方案--------------------
你的界面布局太复杂了吧,看看能不能优化布局什么的,
开下双缓存,或者重写一些控件

还有个方法,切换的时候先冻结自己的窗体,然后加载完成后恢复回来.