我在一个窗口中申明了如下几个自定义控件 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控件的时候,界面闪烁?想请教这个问题如何解决?谢谢winform panel 切换 闪烁

解决方案 »

  1.   

    对了 我每个panel控件里面都有背景图片
      

  2.   


    百度到了没?没百度到就修改窗体的DoubleBuffered 属性
      

  3.   

    我在主窗口的属性里设置了DubleBuffered 为true,但是效果不明显
      

  4.   


    百度到了没?没百度到就修改窗体的DoubleBuffered 属性
    效果不明显
      

  5.   

    http://www.cnblogs.com/Charltsing/p/WinFormNoFlicker.html
      

  6.   

    改成用GDI+来绘制背景图试试。
      

  7.   

    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控制面板侧栏的切换效果,就可以尝试这种笨方法。
      

  8.   

    用以下示例的SkinTbaContrl控件应该能满足您的需求。tab标签和控件都支持图片及色调的美化。
    高仿QQ2013通讯DEMO-10.30更新-点击下载
    [精仿]360安全卫士-10.30更新(CSkin Demo)-点击下载