首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增长矩形

增长矩形
EN

Stack Overflow用户
提问于 2013-06-18 18:04:39
回答 2查看 372关注 0票数 0

我有一个增长的矩形绘制在TableLayoutPanel的顶部,但当它增长时,即使有双缓冲,它也会导致可怕的闪烁。

我使用e.Graphics.FillRectangle和一个全局变量来增加矩形的大小。我设置了一个计时器,让它每1/10秒增加1个像素。为什么它会闪烁这么多,我怎么才能停止闪烁呢?

代码语言:javascript
复制
 int grow = 100;
    private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.Red, (tableLayoutPanel1.Width-grow)/2, (tableLayoutPanel1.Height-grow)/2, grow,grow);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        grow += 10;
        tableLayoutPanel1.Refresh();
    }

为了排除所有其他可能性,我从我的程序中删除了所有内容,并从一个不断增长的矩形开始从头开始,但它仍然会产生这种可怕的闪烁。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-18 18:49:54

好的,这是代码。你首先需要用你的控件大小制作背景缓冲区位图。之后,您需要在位图上绘制所有内容,然后将该位图绘制到控件上。

代码语言:javascript
复制
Bitmap backBuffer = null;
int grow = 100;
private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
    if (backBuffer == null)
        backBuffer = new Bitmap(tableLayoutPanel1.Width, tableLayoutPanel1.Height);
    Graphics g = Graphics.FromImage(backBuffer);
    g.Clear(tableLayoutPanel1.BackColor);
    g.FillRectangle(Brushes.Red, (tableLayoutPanel1.Width - grow) / 2, (tableLayoutPanel1.Height - grow) / 2, grow, grow);
    e.Graphics.DrawImage(backBuffer, 0, 0, backBuffer.Width, backBuffer.Height);
    g.Dispose();
}
private void tableLayoutPanel1_Resize(object sender, EventArgs e)
{
    backBuffer = null;
}
private void timer1_Tick(object sender, EventArgs e)
{
    grow += 10;
    tableLayoutPanel1.Invalidate();
}

请注意,每次调整TableLayoutPanel的大小时都需要创建新的Bitmap。此外,我建议使用Invalidate()而不是Refresh()

但这仍将包含一些潜在的闪烁。为了完全避免闪烁,除了前面的代码之外,还需要对TableLayoutPanel进行子类化,并以永远不会调用base.OnPaintBackground的方式覆盖OnPaintBackground()方法。这样就不会有任何闪动了。出现闪烁的原因是因为在绘制Rectangle之前,任何时候都会重新绘制背景。使用此BackgroundlessTableLayoutPanel切换原始TableLayoutPanel

代码语言:javascript
复制
public class BackgroundlessTableLayoutPanel : TableLayoutPanel
{
    protected override void OnPaintBackground(PaintEventArgs e)
    {

    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-06-18 18:09:22

大多数控件都有一个Paint事件,您可以在其中实现所需的任何自定义绘制。也可以在重写OnPaint方法的地方实现您自己的控件。See the article here

这两种方法都应该能给出好的结果。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17166063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档