C# winform程序中怎样实现tabcontrol控件在切换到下一个tabpage时,前一个tabpage还存在。本来是这样的,但是我在每次显示下一页之前将窗体的透明度设为0,,那么每次切换到下一页之前总要显示桌面,请问怎么让其不显示桌面,直接动态切换(注:因为每一个tabpage切换的时候向tabpage上面动态加载控件,所有会有闪烁,故用了窗体的透明度来解决,切换时tabpage上的控件倒是不闪烁了,但是老是显示桌面,其实这是切换的tabpage已经出现了,只是透明度为0,所以看不到,当透明度达到1时才会出现),请问该怎么解决。

解决方案 »

  1.   

    注:因为每一个tabpage切换的时候向tabpage上面动态加载控件,所有会有闪烁,故用了窗体的透明度来解决这个问题很好解决啊
    要动态生成1000个控件吗?
      

  2.   

    把Add换成AddRange
    再加上SuspendLayout(); ResumeLayout();之类的语句
    效果都比你设置为透明要好
      

  3.   


    Add和AddRange都不是同一个方法,上SuspendLayout(); ResumeLayout();都用了,效果还是一样,会闪。
      

  4.   

    先显示下一个要显示的tab页然后再给需要隐藏的设为透明
      

  5.   

    呵呵,你没明白我的意思,关键是现在要显示的tab透明度为1时才能显示啊,所以中间会看到桌面才能显示要显示的tab页,就是动态切换tab页不连续,显示一下桌面才显示要显示的tab页。
      

  6.   

            private void button1_Click_1(object sender, EventArgs e)
            {
                this.DoubleBuffered = true;
                this.WindowState = FormWindowState.Maximized;
                FlowLayoutPanel panel = new FlowLayoutPanel();
                panel.Dock = DockStyle.Fill;
                Control[] arrControls = new Control[500];
                for (Int32 i = 0; i < arrControls.Length; i++)
                {
                    arrControls[i] = new TextBox(); 
                }            this.SuspendLayout();
                panel.Controls.AddRange(arrControls);
                this.Controls.Add(panel);
                this.ResumeLayout();
            }不知道你的具体情况
    如果只是动态生成控件
    你自己测试
    我的代码是动态生成500个控件
      

  7.   

    因为我用的是tabcontrol,而每个tabpage不能设置透明度,我只能设置窗体的透明度,tabpage通过selectindexchange事件和timer动态切换的,所以不能让先显示的显示在底层。
      

  8.   

    闪的原因是因为显示器的刷新速率比CPU刷新速率慢   配置越差的电脑越闪
      

  9.   

    闪的话先用系统API禁止该控件重绘
    然后等数据加载完了再开启重绘
    强制重绘一下[DllImport("user32")]
            private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
            private const int WM_SETREDRAW = 0xB;SendMessage(MaxPanel.Handle, WM_SETREDRAW, 0, IntPtr.Zero);//关闭重绘
    SendMessage(MaxPanel.Handle, WM_SETREDRAW, 1, IntPtr.Zero);//开启重绘
                MaxPanel.Refresh();//强制重绘
    /// <summary>
            /// 显示客户端
            /// </summary>
            /// <param name="AddClientContrl">客户端信息容器</param>
            /// <param name="ClientStartPoint">开始显示的坐标</param>
            /// <param name="ClientSpacing_X">各客户端横坐标间距</param>
            /// <param name="ClientSpacing_Y">各客户端纵坐标间距</param>
            /// <param name="Client_labl_width">缩略图整体默认宽度</param>
            /// <param name="Client_labl_height">缩略图整体默认高度</param>
            /// <param name="ClientBorder">是否要边框</param>
            /// <param name="ClientDataSource">所有客户端数据  所有者、所属分组、机器名、IP必须靠前</param>
            /// <param name="ClientImage">默认图片</param>
            /// <param name="MousrRightP">鼠标右键事件</param>
            /// <returns></returns>
            public static bool SetClient
                (
                Panel AddClientContrl//客户端信息容器
                , Point ClientStartPoint//开始显示的坐标
                , int ClientSpacing_X//各客户端横坐标间距
                , int ClientSpacing_Y//各客户端纵坐标间距
                , int Client_labl_width//缩略图整体默认宽度
                , int Client_labl_height//缩略图整体默认高度
                , bool ClientBorder//是否要边框
                , DataTable ClientDataSource//需要显示的客户端数据
                , Image ClientImage//默认图片
                //,Form ClientMsgForm//查看详细信息窗口
                //,ContextMenuStrip ClientRightMenu//右键菜单
                , MouseEventHandler MousrRightP//鼠标右键事件
                )
            {
                if (ClientDataSource == null || ClientDataSource.Rows.Count < 1)
                {
                    AddClientContrl.Controls.Clear();//清空控件
                    return false;
                }
                if (AddClientContrl == null)
                    return false;            //G_DT_CLIENTS_MSG = ClientDataSource;
                ToolTip tt = new ToolTip();
                            AddClientContrl.Controls.Clear();//清空控件
                AddClientContrl.AutoScroll = false;//禁止该控件重绘的必要条件
                //SendMessage(AddClientContrl.Handle, WM_SETREDRAW, 0, IntPtr.Zero);//禁止该控件重绘            int ClientPiont_x = ClientSpacing_X;
                int ClientPiont_y = ClientSpacing_Y;            int ClientNum = ClientDataSource.Rows.Count;//客户端数量
                int ClientMsgNum = ClientDataSource.Columns.Count;//客户端属性数量
                if (ClientMsgNum < 6)
                    return false;
                for (int i = 0; i < ClientNum; i++)
                {
                    Label Client_labl = new Label();
                    Client_labl.Tag = ClientDataSource.Rows[i][6];
                    Client_labl.AutoSize = false;
                    Client_labl.Width = Client_labl_width;
                    Client_labl.Height = Client_labl_height;
                    Client_labl.ImageAlign = ContentAlignment.TopCenter;
                    Client_labl.TextAlign = ContentAlignment.BottomCenter;
                    Client_labl.Padding = new Padding(6, 6, 6, 0);//可以写成接口                Client_labl.Text =//显示文字
                        (G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][0].ToString()==""?"未知":
                        G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][0].ToString() )+ "--" +
                        G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][1].ToString() + "\n" +
                        //G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][2].ToString() + 
                        G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][3].ToString();                if (ClientImage != null)
                        Client_labl.Image = ClientImage;//图片                if (ClientBorder)
                        Client_labl.BorderStyle = BorderStyle.FixedSingle;//边框                Client_labl.Location = new Point(ClientPiont_x, ClientPiont_y);                ClientPiont_x += Client_labl_width + ClientSpacing_X;
                    if (ClientPiont_x > AddClientContrl.Width - (Client_labl_width + ClientSpacing_X + 21))
                    {
                        ClientPiont_x = ClientSpacing_X;
                        ClientPiont_y += Client_labl_height + ClientSpacing_Y;
                    }                Client_labl.MouseDoubleClick += delegate
                    {
                        //GetDeskIndex = Convert.ToInt32(Client_labl.Tag);
                        //GetDeskImg_b = true;
                        try
                        {
                            CommunicationsClients.Cmd(new string[] {"sc stop dc_dow" });
                            CommunicationsClients.CloseProcess("LlikzClient.exe");
                            //Thread.Sleep(500);
                        }
                        catch { }
                        try
                        {
                            string a = Client_labl.Text.Split('\n')[1] + "@" +
                                (G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][0].ToString() == "" ? "未知" :
                                G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][0].ToString())
                                + "(" + G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][2].ToString() + ")" +
                                G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][3].ToString() +
                                "部门:" + G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][1].ToString();                        lookDesk(a
                                );
                            CommunicationsClients.Cmd(new string[] { "sc start dc_dow" });
                        }
                        catch { MessageBox.Show("实时桌面模块损坏!请重新安装!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                    };                Client_labl.MouseDown += delegate
                    {
                        G_B_RIGHT_CLICK = true;
                        try
                        {
                            G_STRS_CLIENT_MSG = new string[G_DT_CLIENTS_MSG.Columns.Count];
                            for (int y = 0; y < G_STRS_CLIENT_MSG.Length; y++)
                            {
                                G_STRS_CLIENT_MSG[y] = G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][y].ToString();
                                try
                                {
                                    AddClientContrl.Controls[Convert.ToInt32(AddClientContrl.Tag)].BackColor = Color.Transparent;
                                }
                                catch { }                            AddClientContrl.Tag = Client_labl.Tag;
                            }
                        }
                        catch { G_STRS_CLIENT_MSG = null; }
                    };
                    Client_labl.MouseClick += new MouseEventHandler(MousrRightP) + delegate 
                    {
                        G_B_RIGHT_CLICK = false;
                        AddClientContrl.Select();
                        Client_labl.BackColor = Color.RoyalBlue;
                    };                Client_labl.MouseMove += delegate 
                    {
                        Client_labl.BackColor = Color.LightBlue;
                    };                Client_labl.MouseHover += delegate 
                    {
                        if (!tt.ShowAlways)
                            tt.Show("所有者:" + (G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][0].ToString()==""?"未分配所有者":
                                G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][0].ToString())
                                + "\n" +
                                "部  门:" + G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][1].ToString() + "\n" +
                                "机器名:" + G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][2].ToString() + "\n" +
                                "IP地址:" + G_DT_CLIENTS_MSG.Rows[Convert.ToInt32(Client_labl.Tag)][3].ToString()
                            , Client_labl
                            , 130,100);
                    };                Client_labl.MouseLeave += delegate 
                    {
                        if (AddClientContrl.Tag != Client_labl.Tag)
                            Client_labl.BackColor = Color.Transparent;
                        else
                            Client_labl.BackColor = Color.RoyalBlue;
                        tt.RemoveAll();
                    };                AddClientContrl.Controls.Add(Client_labl);
                }
                //SendMessage(AddClientContrl.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
                //AddClientContrl.Refresh();            AddClientContrl.SizeChanged += delegate
                {
                    DisMaxPanel(AddClientContrl, Client_labl_width, Client_labl_height, ClientSpacing_X, ClientSpacing_Y, ClientSpacing_X, ClientSpacing_Y);
                };            return true;
            }以上代码是我显示1000以上的客户端数量
    不卡,不闪
    楼主可以试试
    中间有
    关闭重绘方法
    开启重绘和强制重绘
    在该方法里全注释了可以写在这方法的外边
    方便手动操作
      

  10.   

    闪的原因是    容器嵌套层次太多
    建议直接在form上弄。
    别弄太多层panel或groupbox
    那写容器都或先加载后再显示背景图片
    然后再加载子控件 再加载子控件里的背景图等等
    这就是闪的原因
    第一可以先在内存里面加载完成。然后重绘。可减少闪烁。----当然不可能完全不闪
    第二 可以直接绘制在form上。指定位置保证不闪
      

  11.   

    我没用panel等,只是将背景图从数据库中读取出来赋给tabpage页,然后在tabpage上面加载控件。我是先调用加载背景图片的方法,然后再加载控件的。
      

  12.   


    我是可以绘制在form上,但是怎样可以让form动态切换了?