C#自定义控件背景色透明的方法

I struggled for ages with the problem of having controls show through a control that was painted on top of them.  It seems that ControlStyles.SupportsTransparentBackColor just allowed the control to pick up the container's background colour/image and wouldn't prevent the control from hiding any controls that were underneath it. I eventually found an answer so I thought I would post it here.  This code example of a Pointer class, will take an alpha-blended png in the constructor and allow all the controls behind it to show through the transparent or semi-transparent pixels in the png, even when the pointer's location is changed ...

public class Pointer : Control

{

    public Pointer(Image image)

        : base()

    {

        Image = image;

        SetStyle(ControlStyles.SupportsTransparentBackColor

          | ControlStyles.UserPaint

          | ControlStyles.AllPaintingInWmPaint

          | ControlStyles.Opaque, true);

        BackColor = Color.Transparent;

    }



    protected override void OnLocationChanged(EventArgs e)

    {

        // pick up the container's surface again. 

        Visible = false;

        Visible = true;

    }



    protected override CreateParams CreateParams

    {

        get

        {

            CreateParams cp = base.CreateParams;

            cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 

            return cp;

        }

    }



    private Image image;

    public Image Image

    {

        get

        {

            return image;

        }

        set

        {

            image = value;

            Size = image.Size;

        }

    }



    protected override void OnPaint(PaintEventArgs pe)

    {

        base.OnPaint(pe);

        pe.Graphics.DrawImage(image, 0, 0);

    }



} 

你可能感兴趣的:(自定义控件)