Rendere trasparente un controllo

Attualmente sto sviluppando un semplice strumento di modifica delle immagini usando Winforms e .NET 3.5 (ambiente di lavoro).

Ho il requisito che quando l’utente fa clic su un pulsante di selezione dello strumento, viene visualizzato un quadrato (rettangolo in C #) che può scalare tra 100x100 e 400x400 . Ho risolto questo problema: il problema è la trasparenza dello sfondo del rettangolo.

Sono un po ‘confuso se la trasparenza è supportata in .NET 3.5 , ho provato quanto segue:

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

Ma questo non ha alcun effetto – ogni consiglio sarebbe apprezzato.

Questo è il mio controllo speciale che contiene una proprietà di opacità, funziona 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); } } 

Sarà necessario utilizzare la proprietà Opacity e impostarlo su zero per rendere la forma invisibile.

Se vuoi rendere trasparente un controllo, come hai provato nel tuo esempio, consulta questo articolo

Come: Assegna al tuo controllo uno sfondo trasparente

Dice che il codice che hai scritto deve essere nel costruttore del controllo. Quindi, immagino, sarà necessario creare un controllo personalizzato derivato dal tipo più probabile del pulsante pnlSelectArea. Nel costruttore di questo controllo personalizzato puoi scrivere il codice per impostare il suo stile e colore.

Ecco cosa ha funzionato per me perché le altre soluzioni non hanno funzionato.

Questo è con UserControl trasparente aggiunto a ListView / TreeView Control Collection

So che dice ButtonRenderer ma dovrebbe funzionare per qualsiasi controllo.

In UserControl:

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

nel controllo Parent:

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

grande!! Sono finalmente riuscito a disegnare forms trasparenti. Ho aggiunto un metodo virtuale

 Draw(g); 

Appena prima

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

e alla fine la dichiarazione del metodo virtuale

 protected virtual void Draw(Graphics g){ } 

Ora posso continuare a creare le mie forms trasparenti, la grafica ecc …