Hacer un control transparente

Actualmente estoy desarrollando una herramienta simple de edición de imágenes usando Winforms y .NET 3.5 (entorno de trabajo).

Tengo el requisito de que cuando el usuario haga clic en el botón Seleccionar herramienta, aparecerá un cuadrado (rectángulo en C #) que puede escalar entre 100x100 y 400x400 . Tengo este bit resuelto: el problema es hacer que el fondo del rectángulo sea transparente.

No estoy muy claro si la transparencia es compatible con .NET 3.5 . He intentado lo siguiente:

 SetStyle(ControlStyles.SupportsTransparentBackColor, true); pnlSelectArea.BackColor = Color.Transparent; pnlSelectArea.ForeColor = Color.Transparent; selectArea1.BackColor = Color.Transparent; selectArea1.ForeColor = Color.Transparent; 

Pero esto no tiene ningún efecto, cualquier consejo sería apreciado.

Este es mi Control especial que contiene una propiedad de opacidad, funciona al 100%:

 using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.Design; public class TranspCtrl : Control { public bool drag = false; public bool enab = false; private int m_opacity = 100; private int alpha; public TranspCtrl() { SetStyle(ControlStyles.SupportsTransparentBackColor, true); SetStyle(ControlStyles.Opaque, true); this.BackColor = Color.Transparent; } public int Opacity { get { if (m_opacity > 100) { m_opacity = 100; } else if (m_opacity < 1) { m_opacity = 1; } return this.m_opacity; } set { this.m_opacity = value; if (this.Parent != null) { Parent.Invalidate(this.Bounds, true); } } } protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle = cp.ExStyle | 0x20; return cp; } } protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1); Color frmColor = this.Parent.BackColor; Brush bckColor = default(Brush); alpha = (m_opacity * 255) / 100; if (drag) { Color dragBckColor = default(Color); if (BackColor != Color.Transparent) { int Rb = BackColor.R * alpha / 255 + frmColor.R * (255 - alpha) / 255; int Gb = BackColor.G * alpha / 255 + frmColor.G * (255 - alpha) / 255; int Bb = BackColor.B * alpha / 255 + frmColor.B * (255 - alpha) / 255; dragBckColor = Color.FromArgb(Rb, Gb, Bb); } else { dragBckColor = frmColor; } alpha = 255; bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor)); } else { bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor)); } if (this.BackColor != Color.Transparent | drag) { g.FillRectangle(bckColor, bounds); } bckColor.Dispose(); g.Dispose(); base.OnPaint(e); } protected override void OnBackColorChanged(EventArgs e) { if (this.Parent != null) { Parent.Invalidate(this.Bounds, true); } base.OnBackColorChanged(e); } protected override void OnParentBackColorChanged(EventArgs e) { this.Invalidate(); base.OnParentBackColorChanged(e); } } 

Tendrá que usar la propiedad Opacity y configurarlo en cero para que la forma sea invisible.

Si desea hacer un control transparente, como lo ha intentado en su ejemplo, consulte este artículo

Cómo: dar a su control un fondo transparente

Dice que el código que ha escrito debe estar en el constructor del control. Por lo tanto, supongo que necesitará crear un control personalizado derivado de su tipo pnlSelectArea con mayor probabilidad de ser un botón. En el constructor de ese control personalizado puede escribir código para establecer su estilo y color.

Esto es lo que funcionó para mí porque las otras soluciones no funcionaron.

Esto es con UserControl transparente agregado a ListView / TreeView Control Collection

Sé que dice ButtonRenderer, pero debería funcionar para cualquier control.

En UserControl:

 protected override void OnPaint(PaintEventArgs e) { ButtonRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this); } 

en el control de Padres:

 protected override void WndProc(ref Message m) { if(m.Msg == 0xF) foreach(Control c in this.Controls) { c.Invalidate(); c.Update(); } base.WndProc(ref m); } 

¡¡estupendo!! Finalmente logré dibujar formas transparentes. He agregado un método virtual

 Draw(g); 

justo antes de

 bckColor.Dispose(); g.Dispose(); base.OnPaint(e); 

y al final la statement del método virtual

 protected virtual void Draw(Graphics g){ } 

Ahora puedo seguir creando mis propias formas transparentes, gráficos, etc.