在开发过程中,一般都会涉及到需要自己绘制控件来满足不同的需求,但是如果在绘制控件时,如果需要显示的东西太多,那么控件在显示时,肯定是需要很长时间才能显出出来,这样一来,如果控件刷新速度很快,就会产生问题了.
那么,如何解决这个问题呢?相信大家自然而然的都会想到,使用双缓冲的方式,是的,这种方式可以在一定程度上减少这个问题,但是不能彻底解决这个问题,经过自己的实验,发现通过下面的方式,可以较好的解决这个问题(当然,也是需要使用双缓冲的).
下述例子,在.Net Framework3.5 + Visual Studio 2008上测试通过.
步骤一:
使用VS2008建立一个WinForm功程,在里面添加一个类库,并继承自Control控件
步骤二:
在新添加的控件类库中,添加一个Bitmap的私有变量
private Bitmap bitmap;
步骤三:
增加一个设置Bitmap的函数
private void SetDrawBitmap() { int iWidth = this.Width; int iHeight = this.Height; bitmap = new Bitmap(iWidth, iHeight);
步骤四:Graphics g = Graphics.FromImage(bitmap); //设置 System.Drawing.Graphics对象的SmoothingMode属性为HighQuality g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //下面这个也设成高质量 g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; //下面这个设成High g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; g.DrawLine(new Pen(Color.Black), new Point(10, 20), new Point(50, 20)); Brush brush = new SolidBrush(Color.FromArgb(50, 200, 100, 150)); Rectangle rect = new Rectangle(0, 0, this.Width, this.Height); g.FillRectangle(brush, rect); }
重载OnPaint函数
步骤五:protected override void OnPaint(PaintEventArgs e) { Rectangle rect = new Rectangle(0, 0, this.Width, this.Height); e.Graphics.DrawImage(bitmap, rect); }
在控件类库的构造函数中,添加对SetDrawBitmap函数的调用
步骤六:public TBControl() { this.BackColor = Color.White; SetDrawBitmap(); }
编译功程,大功告成,是不是很简单呢!!!!