Search code examples
c#.netimagetransparencypicturebox

Transparent images with C# WinForms


I am working on a Windows Forms application in VS 2008, and I want to display one image over the top of another, with the top image being a gif or something with transparent parts.

Basically I have a big image and I want to put a little image on top if it, so that they kinda appear as one image to the user.

I've been trying to use a picturebox, but this doesn't seem to have worked, any suggestions?


Solution

  • I was in a similar situation a couple of days ago. You can create a transparent control to host your image.

    using System;
    using System.Windows.Forms;
    using System.Drawing;
    
    public class TransparentControl : Control
    {
        private readonly Timer refresher;
        private Image _image;
    
        public TransparentControl()
        {
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            BackColor = Color.Transparent;
            refresher = new Timer();
            refresher.Tick += TimerOnTick;
            refresher.Interval = 50;
            refresher.Enabled = true;
            refresher.Start();
        }
    
        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();
        }
    
        private void TimerOnTick(object source, EventArgs e)
        {
            RecreateHandle();
            refresher.Stop();
        }
    
        public Image Image
        {
            get
            {
                return _image;
            }
            set
            {
                _image = value;
                RecreateHandle();
            }
        }
    }