繁体   English   中英

透明的图片框闪烁

[英]Transparent picturebox flickers

因此,我正在编写一个项目,该项目是不使用游戏引擎而由纯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();
        }
    }
}

减少闪烁的一种方法是创建两个不同的位图。 一个吸引人,另一个吸引人。

Image BackBuffer;
Image BrontBuffer;

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

所有内容绘制到BackBuffer中,然后显示FrontBuffer。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM