0

私の 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 Studio を閉じてソリューションを再度開くまではうまくいくようです。その後、私のコントロールはすべてデザイナーで消えます。プログラムを実行すると表示されますが、アプリケーションの設計を続行できるデザイナーでも表示する必要があります。

これらのコントロールは常にプログラムを数秒間フリーズさせているため、これだけで十分ではないことはわかっています。

だから私の質問は..透明なコントロールのコードをどこで見つけることができるか、または私が一緒に投げたものを修正する方法を誰かが知っていますか?

4

1 に答える 1

0

IsTransparent プロパティが true に設定されるまで、TransparentPicture を通常の PictureBox にします。

設計時にはプロパティを 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;
于 2012-04-22T14:52:28.397 に答える