protected override void onpaint(painteventargs e)
{
system.drawing.bitmap b = new bitmap(this.width,this.height);//双缓冲技术,先将所有要画的画在该图片中,再调用gs画出该图片.
graphics g = graphics.fromimage((system.drawing.image)b);
//
在这里画你所需要画的
//
e.graphics.drawimage((system.drawing.image)b,0,0);
g.dispose();
base.onpaint (e);
}
其中要用到的一个技术就是双缓存技术,双缓冲技术是为了解决界面闪烁而采用的一项技术,就是将要绘制的界面先绘制在内存中一个虚拟的、和正在显示的界面同样大小的一个区域上,界面变化时将这个内存中的图象一次性绘制到屏幕上。graphics gxoff;if (m_bmpoffscreen == null) //要双缓冲的位图。m_bmpoffscreen = new bitmap(clientsize.gxoff = graphics.gxoff.//绘制一些位图。//从内存位图绘制。}在上面的代码中,我们通过调用 graphics 类的静态 fromimage 方法在与我们的控件大小相同的空位图中创建了一个 graphics 对象。
======================================
通常,双缓存逻辑如下所示:
protected override void onpaint(painteventargs e ){graphics gxoff; //屏幕外的图像 if (m_bmpoffscreen == null) //要双缓冲的位图 { m_bmpoffscreen = new bitmap(clientsize.width, clientsize.height); } gxoff = graphics.fromimage(m_bmpoffscreen); gxoff.clear(this.backcolor); //绘制一些位图 gxoff.drawimage(bmpparent, 0, 0, bmprect, graphicsunit.pixel); //边界矩形rectangle rc = this.clientrectangle; rc.width--; rc.height--; //绘制边界 gxoff.drawrectangle(new pen(color.black), rc); //从内存位图绘制 e.graphics.drawimage(m_bmpoffscreen, 0, 0); base.onpaint( e );}
在上面的代码中,我们通过调用 graphics 类的静态 fromimage 方法在与我们的控件大小相同的空位图中创建了一个 graphics 对象。我们在内存中的 graphics 对象上进行所有的绘图,完成后,将整个准备好的位图覆盖到控件的图形上即可。
添加这段代码
public void refresh()
{
setstyle(controlstyles.supportstransparentbackcolor,true);
setstyle(controlstyles.allpaintinginwmpaint, true);
setstyle(controlstyles.userpaint, true);
setstyle(controlstyles.doublebuffer, true);
refresh();
}
新闻热点
疑难解答