Come posso impostare l’opacità o la trasparenza di un pannello in WinForms?

Mi stavo chiedendo come modificare o modificare la trasparenza di un pannello in C #, non l’intero modulo, ma solo il pannello .. Ho visto molti tutorial in C # su Opacity, ma è relativo al modulo. Sto cercando come potrebbe essere ansible solo con il Pannello. Grazie!

Sì, l’opacità può funzionare solo su windows di primo livello. Utilizza una funzionalità hardware della scheda video, che non supporta windows secondarie, come Pannello. L’unica class derivata da Control di primo livello in Winforms è Form.

Molti dei controlli “puri” di Winform, quelli che eseguono la propria verniciatura invece di lasciare che un controllo nativo di Windows esegua il lavoro, supportano comunque un BackColor trasparente. Panel è uno di questi. Usa un trucco, chiede al Genitore di disegnarsi per produrre i pixel dello sfondo. Un effetto collaterale di questo trucco è che i controlli sovrapposti non funzionano, si vedono solo i pixel principali, non i controlli sovrapposti.

Questo modulo di esempio lo mostra al lavoro:

public partial class Form1 : Form { public Form1() { InitializeComponent(); this.BackColor = Color.White; panel1.BackColor = Color.FromArgb(25, Color.Black); } protected override void OnPaint(PaintEventArgs e) { e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100); } } 

Se ciò non è abbastanza buono, è necessario considerare l’accatastamento di moduli uno sopra l’altro. Così

Notevole forse è che questa restrizione viene revocata in Windows 8. Non utilizza più la funzione di sovrapposizione dell’adattatore video e DWM (aka Aero) non può più essere distriggersto. Che rende l’opacità / trasparenza sulle windows figlio facile da implementare. Basarsi su questo è ovviamente la musica del futuro per un po ‘a venire. Windows 7 sarà il prossimo XP 🙂

Per chi sta ancora cercando un pannello totalmente trasparente, ho trovato una bella soluzione in questo blog di William Smash che a sua volta lo ha preso da Tobias Hertkorn sul suo blog T # . Ho pensato che valesse la pena pubblicarlo come risposta qui.

Codice C #:

 public class TransparentPanel : Panel { protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT return cp; } } protected override void OnPaintBackground(PaintEventArgs e) { //base.OnPaintBackground(e); } } 

Codice VB.Net:

 Public Class TransparentPanel Inherits Panel Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams Get Dim cp As CreateParams = MyBase.CreateParams cp.ExStyle = cp.ExStyle Or &H20 ''#WS_EX_TRANSPARENT Return cp End Get End Property Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs) ''#MyBase.OnPaintBackground(e) End Sub End Class 

Sulla base delle informazioni trovate su http://www.windows-tech.info/3/53ee08e46d9cb138.php , sono stato in grado di ottenere un controllo del pannello trasshiny usando il seguente codice.

 public class TransparentPanel : Panel { protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT return cp; } } protected override void OnPaint(PaintEventArgs e) { e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle); } } 

L’avvertenza è che tutti i controlli aggiunti al pannello hanno uno sfondo opaco. Tuttavia, il pannello trasshiny mi è stato utile per bloccare parti della mia applicazione WinForms in modo che gli utenti si concentrassero sull’area appropriata dell’applicazione.

Per quanto ne so, un pannello può avere solo un colore trasparente, non è ansible controllare l’opacità del pannello. Quindi, puoi avere alcune parti di un pannello completamente trasparenti ma non il 50% per dire qualcosa.

Per usare la trasparenza è necessario definire la proprietà del colore trasparente.

Prova questo:

 panel1.BackColor = Color.FromArgb(100, 88, 44, 55); 

cambia alfa (A) per ottenere l’opacità desiderata.

Non dimenticare di portare il pannello in primo piano durante la creazione dynamic nel costruttore di moduli. Esempio di sovrapposizione del pannello trasparente del controllo struttura a tabs.

 panel1 = new TransparentPanel(); panel1.BackColor = System.Drawing.Color.Transparent; panel1.Location = new System.Drawing.Point(0, 0); panel1.Name = "panel1"; panel1.Size = new System.Drawing.Size(717, 92); panel1.TabIndex = 0; tab2.Controls.Add(panel1); panel1.BringToFront(); 

// < == altrimenti gli altri controlli dipingono sopra il pannello trasparente

Volevo solo aggiungere alla soluzione di William Smash perché non potevo accedere al suo blog, quindi le risposte che potrebbero essere state lì per le mie semplici domande non sono state trovate.

Ci ho messo un po ‘a capire, ma forse stavo solo avendo un momento …

Se non lo si è già fatto, è necessario aggiungere un riferimento a System.Windows.Forms nelle proprietà del progetto.

Inoltre dovrai aggiungere

 Imports System.Windows.Forms 

al file in cui si sta aggiungendo la class di sostituzione.

Per OnPaintBackground è necessario aggiungere quindi un riferimento per System.Drawing

 Imports System.Drawing.Printing.PrintEventArgs 

Questo funziona per me. Nell’esempio sottostante, l’intervallo alfa può essere un valore compreso tra 0 e 255. In precedenza, ho fatto un errore pensando che dovesse essere un valore percentuale.

Dim x as integer = 230 Panel1.BackColor = Color.FromArgb(x, Color.Blue)

alcuni commenti dicono che funziona e alcuni dicono che non funziona solo per lo sfondo del form e non per altri controls dietro