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); } }