c# winform程序 窗口切换 乱闪 怎么解决

gong2005d 2012-05-13 07:16:40
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
...全文
974 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gong2005d 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
你的界面布局太复杂了吧,看看能不能优化布局什么的,
开下双缓存,或者重写一些控件

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


怎么冻结,然后加载恢复?
1013123227@qq.com 如果有案例 发一份
Soloboy1020 2012-05-15
  • 打赏
  • 举报
回复
你的界面布局太复杂了吧,看看能不能优化布局什么的,
开下双缓存,或者重写一些控件

还有个方法,切换的时候先冻结自己的窗体,然后加载完成后恢复回来.
gong2005d 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
是不是在 Load中用了太多方法了
[/Quote]
没有啊
gong2005d 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
这需要使用Invoke
[/Quote]

Invoke
多线程不怎么会用
能教下我吗?
youzelin 2012-05-14
  • 打赏
  • 举报
回复
f.Show();
f.Dock = DockStyle.Fill;

以上两句话的位置换一下试试呢?一般来说,Show 是放到最后的。
huwei001982 2012-05-14
  • 打赏
  • 举报
回复
有效的办法就是像8楼朋友说的

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

这是 winform 的劣根性,改不了的,所以现在都换 wpf 了,手机开发用 silverlight
huwei001982 2012-05-14
  • 打赏
  • 举报
回复
我就知道有人说“双缓冲”, 哈哈

没用的
gong2005d 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
我也遇到这种情况,那是因为窗体中的控件比较多所导致的,尤其是Panl多,这样刷新的时候不同步导致会闪烁,楼主可以调整小界面元素的数量,最好可以简化一些控件,如果有需要可以使用GDI+自己画!!!
[/Quote]

分析很有道理
ufo1199078 2012-05-14
  • 打赏
  • 举报
回复
我也遇到这种情况,那是因为窗体中的控件比较多所导致的,尤其是Panl多,这样刷新的时候不同步导致会闪烁,楼主可以调整小界面元素的数量,最好可以简化一些控件,如果有需要可以使用GDI+自己画!!!
蓝色范思哲 2012-05-14
  • 打赏
  • 举报
回复
我也经常遇到这样的问题,双缓冲可以提高效果
garfieldzf 2012-05-14
  • 打赏
  • 举报
回复
这需要使用Invoke
xky96 2012-05-14
  • 打赏
  • 举报
回复
同样遇到这个问题,mark
happyrain2010 2012-05-14
  • 打赏
  • 举报
回复
是不是在 Load中用了太多方法了
加旋仔 2012-05-13
  • 打赏
  • 举报
回复
判断一下窗体是否被激活,如果A要激活,遍历重绘A窗体的控件,禁止B的所有控件重绘,反之一样.
gong2005d 2012-05-13
  • 打赏
  • 举报
回复
怎么调整呢?
余山水 2012-05-13
  • 打赏
  • 举报
回复
你换个思路,合理调整窗口布局怎样

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧