winform 怎样防止窗体闪屏!

超凡 2012-03-08 11:18:16
用过双缓存,基本没啥用!

在窗体启动前将窗体隐藏,加载完后再显示,这似乎有点作用,大效果不大明显! 在单击tabcontrol控件的另一个选项卡后再单击回来,明显闪烁很大! tabcontrol控件中布局用了不少panel控件!

还一个是图片比较大! 我试过背景图片小一些,闪烁明显小一些!

请问大伙有啥办法没有! 我怀疑有循环重绘? 怎样防止重绘?举些例子,列出代码!谢谢了!
...全文
1782 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
浅水遨游 2014-06-15
  • 打赏
  • 举报
回复
还有不重绘背景的招数么?
ciecalm 2014-05-18
  • 打赏
  • 举报
回复
q69287690赞个
SeeYou孙悟空 2014-02-25
  • 打赏
  • 举报
回复
引用 17 楼 q69287690 的回复:
protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } } 在父窗体任何位置加上如上代码即可
这个好像只对XP和Vista 有用,对于现在的win7透明窗体条 没有用,闪烁的非常明显。。。。我也没弄出来好办法。。。求解。。。。
zhizhuoyuanxing 2013-11-18
  • 打赏
  • 举报
回复
楼主问题解决了没?我现在也遇到这个问题!求解呀
馨香紫韵 2013-04-26
  • 打赏
  • 举报
回复
桑不起,我也遇到这样的问题,求解决方法
q69287690 2012-10-18
  • 打赏
  • 举报
回复
protected override CreateParams CreateParams
{

get
{

CreateParams cp = base.CreateParams;

cp.ExStyle |= 0x02000000;

return cp;

}

}
在父窗体任何位置加上如上代码即可
杨友山 2012-03-08
  • 打赏
  • 举报
回复

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

//开始对控件操作

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

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

超凡 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yysyangyangyangshan 的回复:]
阻止重绘和恢复重绘。
[/Quote]
具体点
杨友山 2012-03-08
  • 打赏
  • 举报
回复
阻止重绘和恢复重绘。
超凡 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kkxxllasasas 的回复:]
在tabcontrol加一个大的panel填满整个tabcontrol
把所有小panel加进去 大的panel Visible为false 最后再为true
[/Quote]

因为我控件都是用代码后台生成后添加到panel中的!
超凡 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kkxxllasasas 的回复:]
在tabcontrol加一个大的panel填满整个tabcontrol
把所有小panel加进去 大的panel Visible为false 最后再为true
[/Quote]

本身是这样做的!
快乐大法师 2012-03-08
  • 打赏
  • 举报
回复
在tabcontrol加一个大的panel填满整个tabcontrol
把所有小panel加进去 大的panel Visible为false 最后再为true
bdmh 2012-03-08
  • 打赏
  • 举报
回复
和你的窗体设计有很大关系,比如控件太多,资源太大等等,已经你切换tab做了什么
惊喜不断 2012-03-08
  • 打赏
  • 举报
回复
重绘的控件,做成 自定义控件, 调用, 是否能好点... .. .. .
kong19 2012-03-08
  • 打赏
  • 举报
回复
tab切换的时候你是不是有地方进行了多次

panel.Invalidate()或者panel.Refresh()了?

如果 图片都是加载后显示,tab切换时每个控件只刷新了一次,应该不会出现闪屏吧
风之影子 2012-03-08
  • 打赏
  • 举报
回复
需求的变更实现,合理的界面元素,特定的分级处理,都是降低界面闪烁的方式。


不建议一个界面太多控件元素,以及太多复杂过大过多的图片。
p363309536 2012-03-08
  • 打赏
  • 举报
回复
原来是这样哦啊
快乐大法师 2012-03-08
  • 打赏
  • 举报
回复
SuspendLayout()和ResumeLayout()用了么 试试吧
淘淘大师 2012-03-08
  • 打赏
  • 举报
回复
主要是你资源消耗大,重绘比较慢
大狗狗 2012-03-08
  • 打赏
  • 举报
回复
楼主问题分成两部分,第一是如何防止程序窗口在启动时的闪烁,第二是如何防止程序窗口在运行时的闪烁。

第一个可以通过如下方法解决:

先托个Timer到设计器里,时间间隔设成20毫妙就行了。

在主窗口构造函数未尾添加:
this.Visible = false;
this.Opacity = 0;
timer1.Start();

计时器函数:
void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
this.Visible = true;
this.Opacity = 1;
}

参考:http://topic.csdn.net/u/20100921/14/724f3ca4-c083-42b9-b8c3-35bec4db9cbd.html

第二个如何防止程序运行时的闪烁,这个是C#固疾了。闪烁原因表面上是我们窗口中放的控件较大,布局较复杂。但做应用程序这是不可避免的。闪烁的根本原因是:C#控件在重绘时会先用白色擦除窗口上原有内容,然后再绘制窗口现有内容。你在程序里指定双缓冲是没有用处的,哪怕从C#控件派生个新类,重载OnPaintBackground,然后注释掉里面代码,照样没用。

真正可能解决C#窗口运行中闪烁有两种方法:
1 使用自绘控件。就是完全自定义一个控件(继承自用户控件)。这样你可以真正的控制是否去擦除背景,而且可以在绘制时采用双缓冲绘制代码,再说一次,指定控件双缓冲属性基本没用。

2 使用win32方法,利用控件句柄,进行窗口子类化,重设WndProc过程,捕获WM_ERASEBKGND消息,直接返回1

可以发现,第一种方法很难去代替那么多系统控件。而第二种方法也有局限,我曾用它解决了webBrowser控件的闪烁问题,但如果在程序中大规模使用,恐怕程序键壮性和性能上还要打个问号。


加载更多回复(2)

110,533

社区成员

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

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

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