VS2010中真正的透明Picturebox

时间:2012-04-22 14:42:23

标签: c# winforms visual-studio transparency picturebox

在我的WinForm应用程序中,我需要分层图像。但是,我无法通过透明控件来放置图像。我做了一些研究并提出了以下课程:

public class TransparentPicture : PictureBox
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x20;
            return cp;
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // do nothing
    }

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

}

这似乎工作正常,直到我关闭Visual Studios并重新打开解决方案。然后我的控件全部消失在设计师中。它们显示我运行程序的时候,但是我需要它们在设计师中展示我可以继续设计我的应用程序。

我知道这不是我需要做的一切,因为这些控件总是导致我的程序冻结几秒钟和东西。

所以我的问题是......如果有人知道我在哪里可以找到透明控件的代码,或者如何修复我扔在一起的代码?

1 个答案:

答案 0 :(得分:0)

使TransparentPicture成为常规PictureBox,直到IsTransparent属性设置为true。

在设计时将属性设置为false,并在FormLoad事件中设置为true(仅在实际运行应用程序时才会发生)。

这样,在设计时,它们将表现为常规图片框,但是当您运行应用程序时,它们将变得透明。

public class TransparentPicture : PictureBox
{
    public bool IsTransparent { get; set; }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;

            if (this.IsTransparent)
            {
                cp.ExStyle |= 0x20;
            }

            return cp;
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        if (!this.IsTransparent)
        {
            base.OnPaintBackground(e);
        }
    }

    protected override void OnMove(EventArgs e)
    {
        if (this.IsTransparent)
        {
            RecreateHandle();
        }
        else
        {
            base.OnMove(e);
        }
    }
}

然后,在FormLoad事件中,您应该:

for (var i = 0; i < this.Controls.Count; i++)
{
    var tp = this.Controls[i] as TransparentPicture;

    if (tp != null)
    {
        tp.IsTransparent = true;
    }
}

或者如果你只有几个:

tp1.IsTransparent = tp2.IsTransparent = tp3.IsTransparent = true;