pintar o Background.Sobrescrever OnPaint(PaintEventArgs e) para desenhar o controle como tu queres (explico melhor depois).using System;using System.Collections.Generic;using System.ComponentModel;using System.Diagnostics;using System.Linq;using System.Text;using System.Windows.Forms;using System.Drawing;namespace ControleTransparente{ public partial class MeuControle : Control { /*Define um atributo do tipo Image e recebe uma imagem que faz parte dos recursos que eu carreguei para o meu software*/ private Image arqImagem = global::ControleTransparente.Properties.Resources.Imagem1; /*Ponto do meu controle onde eu desenharei meu texto.*/ private Point textLocation = new Point(); public MeuControle() : base() { InitializeComponent(); this.Name = "MeuControle"; /*Usando metodo SetStyle para habilitar transparencia.*/ this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); this.BackgroundImage = new Bitmap(arqImagem); this.Font = new Font("Arial Rounded MT Bold", 12F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0))); this.ForeColor = Color.White; this.Text = "MeuControle"; this.BackColor = Color.Transparent; } /*Uma propriedade para alterar a localizacao do texto no controle.*/ public Point TextLocation { get { retutn this.textLocation; } set { this.textLocation = value; } } /*Sobrescrevendo a propriedade CreateParams*/ protected override CreateParams CreateParams { get { CreateParams createParams = base.CreateParams; createParams.ExStyle |= 0x00000020; return createParams; } } /*Sobrescrevendo o OnPaintBackground*/ protected override void OnPaintBackground(PaintEventArgs pevent) { /*Aqui o background seria pintado. A ideia e justamente sobrescrever e deixar sem codigo para que nada seja pintado no plano de fundo.*/ } /*Sobrescrevendo o OnPaint*/ protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); /*Aqui deve ser feita a parte visual do controle. Inserir o codigo que gera a aparencia desejada.*/ /*No meu caso eu vou colocar uma imagem que e a imagem do meu controle e depois desenhar o texto, apenas para exemplificar.*/ /*Nota: Para desenhar a imagem, e preciso que ela ja esteja instanciada inicialmente, ou sera gerada uma excecao.*/ e.Graphics.DrawImage(BackgroundImage, new Rectangle(0, 0, this.Size.Width, this.Size.Height)); /*Mede tamanho do texto.*/ SizeF tamanhoTexto = e.Graphics.MeasureString(this.Text, this.Font); /*Define a localizacao do texto de forma que ele fique centralizado no controle.*/ this.TextLocation = new Point((int)(this.Size.Width / 2 - tamanhoTexto.Width / 2), (int)(this.Size.Height / 2 - tamanhoTexto.Height / 2)); e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), this.TextLocation); } }}Esse e o codigo em si, mas eu gostaria de fazer algumas observacoes.IMPORTANTE!Esse e o codigo necessario para que o controle fique com aspectos de transparencia em cantos arredondados e afins, mas no caso de controles que o usuario pode mover e preciso ter um cuidado.Por exemplo, se dois controles estiverem sobrepostos e um deles for movido, as partes transparentes vao, diagamos assim, "armazenar lixo" do que estava sobre elas, ou seja, nem sempre elas vao ganhar o aspecto do fundo no novo local onde o controle movido foi posicionado. Pode ser necessario forcar o controle a se redesenhar (por completo ou parcialmente). Existe um metodo para isso chamado Invalidate().Esse metodo possui 5 sobrecargas.Eu nao vou me deter em explicar cada uma delas, apenas explicarei a logica rapidamente.Quando o metodo Invalidate e chamado sem parametros ele forca todo o controle a se redesenhar, chamando o OnPaint que foi sobrescrito no metodo acima.E possivel redesenhar apenas uma parte do controle passando um objeto da classe Rectangle ou uma Region como parametro, por exemplo.As vezes o Invalidate que tu vais precisar chamar nao e o do controle movido em si, mas o do container.Nesse caso, se voce chamar Invalidate()