C# winform程序中怎样实现tabcontrol控件在切换到下一个tabpage时,前一个tabpage还存在。本来是这样的,但是我在每次显示下一页之前将窗体的透明度设为0,,那么每次切换到下一页之前总要显示桌面,请问怎么让其不显示桌面,直接动态切换(注:因为每一个tabpage切换的时候向tabpage上面动态加载控件,所有会有闪烁,故用了窗体的透明度来解决,切换时tabpage上的控件倒是不闪烁了,但是老是显示桌面,其实这是切换的tabpage已经出现了,只是透明度为0,所以看不到,当透明度达到1时才会出现),请问该怎么解决。
解决方案 »
- 如何写一个struct来存储csv文件信息?如何创建一个class scope来存储信息于列表中?
- 跪求c#的扫描枪的代码
- Page.RegisterStartupScript有没办法写到app_code中的类里?
- 对那个i++和++i推荐感到很囧!散分
- 为什么子类无法使用父类的方法和属性?
- GridView删除确认问题,OnClientClick="return confirm('确认要删除此行信息吗?')" ,点取消时候根本不行啊!![顶者有分]
- 指针问题
- 看了一整天的XML,胡涂了
- 就Applied Microsoft.NET Framework Programming一书中的装箱与拆箱提问。(欢迎参加讨论)
- treeview 急~
- 数据转换时,指定的转换无效。
- c#控制流程---------------控制一段时间-------高手指教
要动态生成1000个控件吗?
再加上SuspendLayout(); ResumeLayout();之类的语句
效果都比你设置为透明要好
Add和AddRange都不是同一个方法,上SuspendLayout(); ResumeLayout();都用了,效果还是一样,会闪。
{
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个控件
然后等数据加载完了再开启重绘
强制重绘一下[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以上的客户端数量
不卡,不闪
楼主可以试试
中间有
关闭重绘方法
开启重绘和强制重绘
在该方法里全注释了可以写在这方法的外边
方便手动操作
建议直接在form上弄。
别弄太多层panel或groupbox
那写容器都或先加载后再显示背景图片
然后再加载子控件 再加载子控件里的背景图等等
这就是闪的原因
第一可以先在内存里面加载完成。然后重绘。可减少闪烁。----当然不可能完全不闪
第二 可以直接绘制在form上。指定位置保证不闪
我是可以绘制在form上,但是怎样可以让form动态切换了?