一、闪屏是什么吗?
解:两个窗口在做切换或者打开动作的时候,屏幕会出现短暂的闪烁,闪烁一会后,才会正常显示所需要的窗口。
二、为什么会出现闪屏?
解:1.在做切换或者打开窗体时,窗体要进行绘制,如果窗体有大量的控件,前景色和背景色为透明时,会需要大量的时间进行绘制,就会导致窗体的刷新很慢很卡,这就造成了闪屏的出现。
三、防止闪屏的三种方法
解:
1.忽略 WM_ERASEBKGND 背景消息,同时使控件绘制到缓冲区而不是直接绘制到屏幕,这段代码可以减少闪屏。
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
2.启用windows样式,在窗体代码中加入这段代码:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
3.启用双缓冲,适用于win7以下系统:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
if (this.IsXpOr2003 == true)
{
cp.ExStyle |= 0x00080000;
this.Opacity = 1;
}
return cp;
}
} //防止闪烁
private Boolean IsXpOr2003
{
get
{
OperatingSystem os = Environment.OSVersion;
Version vs = os.Version;
if (os.Platform == PlatformID.Win32NT)
if ((vs.Major == 5) && (vs.Minor != 0))
return true;
else
return false;
else
return false;
}
}
项目遇到情况:通过Dev的树形控件切换不同窗体会出现闪烁,通过改变窗体打开的顺序,同时在打开窗体的启动位置加上( 代码:SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true))。完美解决闪屏问题。
private void treeList1_DoubleClick(object sender, EventArgs e)
{
TreeListNode curNode = this.treeList1.FocusedNode;
if (curNode == null) return;
string name = curNode.GetValue("KeyDisplayName").ToString().Trim();
string formname = curNode.GetValue("TableName").ToString().Trim();
if (formname != "")
{
if (name != "") {
foreach (XtraTabPage page in xtraTabControl1.TabPages)
{
if (page.Text == name)
{
xtraTabControl1.SelectedTabPage = page;//显示该页
return;
}
}
XtraTabPage xpage = new XtraTabPage();
ObjectHandle obj = Activator.CreateInstance(null, "SalePro." + formname + ""); //需要加上项目名称 SalePro
if (obj != null)
{
Form frm = (Form)obj.Unwrap();
//放在Tab前面,会出现闪烁。
// frm.Visible = true;
frm.Dock = DockStyle.Fill;
frm.FormBorderStyle = FormBorderStyle.None;
frm.TopLevel = false;//加载窗体必要的属性
xpage.Controls.Add(frm);
xpage.Text = name;
xtraTabControl1.TabPages.Add(xpage);
xtraTabControl1.SelectedTabPage = xpage;
//放在Tab后面,防止闪烁,
//同时在打开窗体的启动位置加上( 代码:SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true))
frm.Visible = true;
}
}
}
}