我正在看这篇关于双缓冲的文章https://web.archive.org/web/20121123031717/http://www.bobpowell.net/doublebuffer.htm 。我喜欢它的想法,并想在我的 RichTextBox 类上使用它,因为我试图在框中保留几行(10k+)行,每次滚动或更改字符时,将可视文本复制到字符串并放置在另一个 rtb 上要进行语法着色。
问题是当我开始滚动时,我在保存所有文本的 rtb 中出现了非常糟糕的闪烁。我想等到用户完成滚动(如果他们滚动超过一页)来重绘 rtb 中的文本。双缓冲会有帮助吗?以及如何从列出的网站中按照此方法实际“绘制” rtb 中的文本?
方法:
protected override void OnPaint(PaintEventArgs e)
{
if(_backBuffer==null)
{
_backBuffer=new Bitmap(this.ClientSize.Width,this.ClientSize.Height);
}
Graphics g=Graphics.FromImage(_backBuffer);
//Paint your graphics on g here
g.Dispose();
//Copy the back buffer to the screen
e.Graphics.DrawImageUnscaled(_backBuffer,0,0);
//base.OnPaint (e); //optional but not recommended
}
编辑:您还必须将 TextBox 样式设置为此
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer, true);