【问题标题】:Transparent picturebox flickers透明图片框闪烁
【发布时间】:2017-06-13 23:28:10
【问题描述】:

所以我正在编写一个项目,即植物大战僵尸,由纯 c# 制成,没有使用游戏引擎,这里我遇到了图形问题。 我需要在另一个透明图片框上渲染一个透明图片框,我必须定义一个真正透明的新控件,并且透明度方面一切正常,但这里有一个问题: 闪烁:| 由于 RecreateHandle(); 我有这么多。当我更改控件的图像以制作动画以及当它移动以具有真正的透明度时,我使用的方法。 这是我的代码,我想知道是否有人可以提供帮助!

public class TransparentControl : Control
{
    private Image _image;

    public TransparentControl()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint |
             ControlStyles.SupportsTransparentBackColor, true);
        base.BackColor = Color.FromArgb(0, 0, 0, 0);
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x20;
            return cp;
        }
    }

    protected override void OnMove(EventArgs e)
    {
        //RecreateHandle();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        if (_image != null)
        {
            e.Graphics.DrawImage(_image, (Width / 2) - (_image.Width / 2), (Height / 2) - (_image.Height / 2));
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        //Do not paint background
    }

    //Hack
    public void Redraw()
    {
        //RecreateHandle();
    }
    public Image Image
    {
        get
        {
            return _image;
        }
        set
        {
            _image = value;
            //RecreateHandle();
        }
    }
}

【问题讨论】:

  • DoubleBuffer 绘图容器,不要使用控件。画出一切。

标签: c# winforms visual-studio picturebox


【解决方案1】:

减少闪烁的一种方法是创建两个不同的位图。一个用于绘制,一个用于显示。

Image BackBuffer;
Image BrontBuffer;

private void RotateImages()
{
    lock (this.BackBuffer)
    {
        var temp = this.BackBuffer;
        this.BackBuffer = this.FrontBuffer;
        this.FrontBuffer = temp;
    }
}

一切画到您的 BackBuffer 中,然后显示 FrontBuffer。

请注意,您应该使用与 BackBuffer 相同的宽度/高度值声明 FrontBuffer,在您声明 BackBuffer 的几乎完全相同的位置。

在显示前端缓冲区之后立即使用RotateImages() 方法(before 也应该工作)。

【讨论】:

  • 我对图形有点“菜鸟”。那么如何将它添加到我的控件中呢? : /
  • 最好的建议可能是遵循@LarsTech 所说的并完全停止使用控件。画出一切。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 2021-02-09
  • 2016-09-29
  • 2010-12-30
  • 1970-01-01
  • 2012-12-26
相关资源
最近更新 更多