Winform 窗体怎么暂停自绘

csproj 2010-11-29 07:51:35
从数据库读出数据后,需要在窗体动态添加大量控件。
这些控件是一个一个从窗体出现的,整个过程很慢。

SuspendLayout() ResumeLayout()两个方法好像只是针对布局的。
能不能先让窗体停止自绘,等控件增加完成了之后再一起显示出来。
这样显示效率会不会高一点?
...全文
207 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
csproj 2010-12-04
  • 打赏
  • 举报
回复
谢谢大家,最近有点忙 忘记结贴了
冰风漫天 2010-11-29
  • 打赏
  • 举报
回复
不用双缓存或光写this.DoubleBuffered = true;的话,当背景图片较大时,绘制控件确实会比较慢的。
双缓存实现需要自己创建和填充图形缓冲区,我的图片是3M多点的图片,双缓存实现前加这些按钮要花一分钟,加了以后一闪而过,基本是同时出现不花时间。下面是我的测试代码,双击左键添加按钮,双击右键删除按钮,你试试看是不是符合你的情况。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
BufferedGraphics grafx;
public Form1()
{
InitializeComponent();

this.MouseDoubleClick += new MouseEventHandler(Form1_MouseDoubleClick);
this.Load += new EventHandler(Form1_Load);
this.Paint += new PaintEventHandler(Form1_Paint);
}

void Form1_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Controls.Clear();
if (e.Button == MouseButtons.Left)
{
for (int i = 0; i < 1000; i += 100)
{
for (int j = 30; j < 800; j += 100)
{
Button button = new Button();
button.Location = new Point(i, j);
button.Size = new Size(80, 80);
button.BackColor = Color.Red;
this.Controls.Add(button);
}
}
}
}

Button addButton = new Button();
void Form1_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
this.DoubleBuffered = true;
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
BufferedGraphicsContext context = BufferedGraphicsManager.Current;

context.MaximumBuffer = new Size(this.Width, this.Height);
grafx = context.Allocate(this.CreateGraphics(), new Rectangle(0, 0, this.Width, this.Height));

DrawToBuffer(grafx.Graphics);
}

void Form1_Paint(object sender, PaintEventArgs e)
{
grafx.Render(e.Graphics);
}

void DrawToBuffer(Graphics g)
{
Image image = Image.FromFile(@"D:\MyImage.jpg");
g.DrawImage(image, 0, 0, this.Width, this.Height);
}
}
}
jzz870519 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jiabiao113 的回复:]

引用 7 楼 zenghd 的回复:
DoubleBuffered+AddRange+SuspendLayout+ResumeLayout
就算100个控件效果还是可以的,是不是你读数据库太慢了?


数据库值再打开窗口前已经准备好了。

背景太花哨了,在加上新增控件的背景色是Transparent
如果把窗体背景去了,或者新增得控件不用透明背景,速度都感觉不出来慢
[/Quote]

透明时确实很慢 也闪的厉害 如果反过来呢 先添加控件 在设置背景 也许能好点
csproj 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zenghd 的回复:]
DoubleBuffered+AddRange+SuspendLayout+ResumeLayout
就算100个控件效果还是可以的,是不是你读数据库太慢了?
[/Quote]

数据库值再打开窗口前已经准备好了。

背景太花哨了,在加上新增控件的背景色是Transparent
如果把窗体背景去了,或者新增得控件不用透明背景,速度都感觉不出来慢
ZengHD 2010-11-29
  • 打赏
  • 举报
回复
DoubleBuffered+AddRange+SuspendLayout+ResumeLayout
就算100个控件效果还是可以的,是不是你读数据库太慢了?
csproj 2010-11-29
  • 打赏
  • 举报
回复
上面又要好看,又要效率高,真不知道怎么办了。
csproj 2010-11-29
  • 打赏
  • 举报
回复
谢谢wuyq11;

双缓冲是一直开着的,不开更慢。
试了试AddRange,感觉不到速度有没有快。

不过去掉窗口背景之后,速度就飞一样。
csproj 2010-11-29
  • 打赏
  • 举报
回复
我又试了一下。
如果没有背景的话,控件几乎感觉不出来 是一个一个出来的。
加上一张图片背景之后,马上就慢下来了
wuyq11 2010-11-29
  • 打赏
  • 举报
回复
this.DoubleBuffered = true; // 设置双缓冲
Label[] arrLabel = new Label[RowsCount * ColumnsCount];
控件数组
this.panel1.SuspendLayout();
//添加
panel.Controls.AddRange(arrLabel);
this.panel1.ResumeLayout();
品铭工作室 2010-11-29
  • 打赏
  • 举报
回复
那些控件实际上也是绘出来的,如果要快,就自已写这些控件(用画的方式),当然是要付出代价的

110,534

社区成员

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

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

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