请教一下C# panel切换,屏幕闪烁厉害的问题

cst19841103 2013-11-13 06:49:28
我在一个窗口中申明了如下几个自定义控件

private Main_MainControl main_MainControl;
private Main_IntroControl introPanel;
private Main_FlowControl main_FlowControl;
private Main_SearchControl main_SearchControl;
private Main_GetLineControl linePanel;

然后我在主窗口加载函数中初始化他们
private void form_Load(object sender, EventArgs e)
{

main_MainControl = new Main_MainControl();
introPanel = new Main_IntroControl();
main_FlowControl = new Main_FlowControl();
main_SearchControl = new Main_SearchControl();
linePanel = new Main_GetLineControl();
setControlFromId(MAIN_PANEL_FLAG);
}

然后我想在主窗口中通过按钮切换来加载这几个按钮
/// <summary>
/// 一级panel控制器
/// </summary>
/// <param name="iType"></param>
public void setControlFromId(int panelId)
{

//SendMessage(controlPanel.Handle, WM_SETREDRAW, 0, IntPtr.Zero);//关闭重绘
//SendMessage(controlPanel.Handle, WM_SETREDRAW, 0, IntPtr.Zero);//关闭重绘

switch(panelId)
{
case MAIN_PANEL_FLAG:
{
this.controlPanel.Controls.Clear();
_iControl = MAIN_PANEL_FLAG;
controlPanel.Controls.Add(main_MainControl);

main_MainControl.Controls.Add(lineButton);
main_MainControl.Controls.Add(introButton);
main_MainControl.Controls.Add(flowButton);
main_MainControl.Controls.Add(searchButton);
main_MainControl.Controls.Add(handleButton);
break;
}
case INTRO_PANEL_FLAG:
{
this.controlPanel.Controls.Clear();
_iControl = INTRO_PANEL_FLAG;

controlPanel.Controls.Add(introPanel);
introPanel.Controls.Add(backButton);
introPanel.Controls.Add(buttonPanel);
zxjjButton.BackgroundImage = global::Touch.Properties.Resources.zxjsButtonDown;
lcjsButton.BackgroundImage = global::Touch.Properties.Resources.lcjsButtonUp;
ywcxButton.BackgroundImage = global::Touch.Properties.Resources.ywcxButtonUp;
ywblButton.BackgroundImage = global::Touch.Properties.Resources.ywblButtonUp;
pdqpButton.BackgroundImage = global::Touch.Properties.Resources.pdqpButtonUp;

break;
}
case FLOW_PANEL_FLAG:
{
this.controlPanel.Controls.Clear();
_iControl = FLOW_PANEL_FLAG;

controlPanel.Controls.Add(main_FlowControl);
main_FlowControl.Controls.Add(backButton);
main_FlowControl.Controls.Add(buttonPanel);

zxjjButton.BackgroundImage = global::Touch.Properties.Resources.zxjsButtonUp;
lcjsButton.BackgroundImage = global::Touch.Properties.Resources.lcjsButtonDown;
ywcxButton.BackgroundImage = global::Touch.Properties.Resources.ywcxButtonUp;
ywblButton.BackgroundImage = global::Touch.Properties.Resources.ywblButtonUp;
pdqpButton.BackgroundImage = global::Touch.Properties.Resources.pdqpButtonUp;

break;
}
case SEARCH_PANEL_FLAG:
{
this.controlPanel.Controls.Clear();
_iControl = SEARCH_PANEL_FLAG;

controlPanel.Controls.Add(main_SearchControl);
main_SearchControl.Controls.Add(backButton);
main_SearchControl.Controls.Add(buttonPanel);

zxjjButton.BackgroundImage = global::Touch.Properties.Resources.zxjsButtonUp;
lcjsButton.BackgroundImage = global::Touch.Properties.Resources.lcjsButtonUp;
ywcxButton.BackgroundImage = global::Touch.Properties.Resources.ywcxButtonDown;
ywblButton.BackgroundImage = global::Touch.Properties.Resources.ywblButtonUp;
pdqpButton.BackgroundImage = global::Touch.Properties.Resources.pdqpButtonUp; ;

break;
}
case LINE_PANEL_FLAG:
{
this.controlPanel.Controls.Clear();
_iControl = LINE_PANEL_FLAG;

controlPanel.Controls.Add(linePanel);
linePanel.Controls.Add(backButton);
linePanel.Controls.Add(buttonPanel);
zxjjButton.BackgroundImage = global::Touch.Properties.Resources.zxjsButtonUp;
lcjsButton.BackgroundImage = global::Touch.Properties.Resources.lcjsButtonUp;
ywcxButton.BackgroundImage = global::Touch.Properties.Resources.ywcxButtonUp;
ywblButton.BackgroundImage = global::Touch.Properties.Resources.ywblButtonUp;
pdqpButton.BackgroundImage = global::Touch.Properties.Resources.pdqpButtonDown;

break;
}
default:
{
_iControl = MAIN_PANEL_FLAG;
controlPanel.Controls.Add(introButton);
controlPanel.Controls.Add(flowButton);
controlPanel.Controls.Add(searchButton);
controlPanel.Controls.Add(handleButton);
controlPanel.Controls.Add(lineButton);
controlPanel.Controls.Add(main_MainControl);
break;
}
}
//SendMessage(controlPanel.Handle, WM_SETREDRAW, 1, IntPtr.Zero);//开启重绘
//controlPanel.Refresh();//强制刷新指定控件
}

但是实现后发现 按钮切换这些panel控件的时候,界面闪烁?想请教这个问题如何解决?谢谢
...全文
671 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
用以下示例的SkinTbaContrl控件应该能满足您的需求。tab标签和控件都支持图片及色调的美化。 高仿QQ2013通讯DEMO-10.30更新-点击下载 [精仿]360安全卫士-10.30更新(CSkin Demo)-点击下载
cst19841103 2013-11-14
  • 打赏
  • 举报
回复
引用 11 楼 u012592437 的回复:
this.controlPanel.Controls.Clear(); 后 controlPanel.Controls.Add(introPanel); 一定会引起闪烁的。 有个笨方法不知你可否采用: 你可以尝试用两个Panel,一个当前Panel一个缓冲Panel(不可见) 切换时: 1.向不可见的缓冲Panel上添加所需控件 2.将缓冲Panel叠加到当前Panel上 3.让缓冲Panel可见 4.让当前Panel不可见 5.清除当前Panel 6.当前Panel和缓冲Panel交换标识。 如果,你的几个面板非常固定,而且组件不多,那么不如启动后就创建好5个面板,进行层次调整和可见性切换就可以了。 顺便说一下,如果你想做页面切换动画,例如类似Win7控制面板侧栏的切换效果,就可以尝试这种笨方法。
谢谢!好多了!哈哈!
capricciosoft 2013-11-13
  • 打赏
  • 举报
回复
this.controlPanel.Controls.Clear(); 后 controlPanel.Controls.Add(introPanel); 一定会引起闪烁的。 有个笨方法不知你可否采用: 你可以尝试用两个Panel,一个当前Panel一个缓冲Panel(不可见) 切换时: 1.向不可见的缓冲Panel上添加所需控件 2.将缓冲Panel叠加到当前Panel上 3.让缓冲Panel可见 4.让当前Panel不可见 5.清除当前Panel 6.当前Panel和缓冲Panel交换标识。 如果,你的几个面板非常固定,而且组件不多,那么不如启动后就创建好5个面板,进行层次调整和可见性切换就可以了。 顺便说一下,如果你想做页面切换动画,例如类似Win7控制面板侧栏的切换效果,就可以尝试这种笨方法。
cst19841103 2013-11-13
  • 打赏
  • 举报
回复
引用 8 楼 liucqa 的回复:
http://www.cnblogs.com/Charltsing/p/WinFormNoFlicker.html
有点看不懂
  • 打赏
  • 举报
回复
改成用GDI+来绘制背景图试试。
泡泡龙 2013-11-13
  • 打赏
  • 举报
回复
http://www.cnblogs.com/Charltsing/p/WinFormNoFlicker.html
cst19841103 2013-11-13
  • 打赏
  • 举报
回复
引用 5 楼 u010202504 的回复:
[quote=引用 4 楼 cst19841103 的回复:] 请教下 怎么开双缓冲啊?
百度到了没?没百度到就修改窗体的DoubleBuffered 属性[/quote] 效果不明显
cst19841103 2013-11-13
  • 打赏
  • 举报
回复
我在主窗口的属性里设置了DubleBuffered 为true,但是效果不明显
  • 打赏
  • 举报
回复
引用 4 楼 cst19841103 的回复:
请教下 怎么开双缓冲啊?
百度到了没?没百度到就修改窗体的DoubleBuffered 属性
cst19841103 2013-11-13
  • 打赏
  • 举报
回复
请教下 怎么开双缓冲啊?
小猪八Q 2013-11-13
  • 打赏
  • 举报
回复
嗯,确保双缓冲开开~
  • 打赏
  • 举报
回复
双缓冲开了没
cst19841103 2013-11-13
  • 打赏
  • 举报
回复
对了 我每个panel控件里面都有背景图片

110,538

社区成员

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

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

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