Como posso definir a opacidade ou transparência de um painel no WinForms?

Eu queria saber como alterar ou modificar a transparência de um painel em c #, não o formulário inteiro, mas o painel apenas .. Eu vi muitos tutoriais em c # Opacidade, mas é para o formulário. Estou procurando como isso poderia ser possível apenas com o Painel. Obrigado!

Sim, a opacidade só funciona em janelas de nível superior. Ele usa um recurso de hardware do adaptador de vídeo, que não suporta janelas filhas, como o Panel. A única class derivada de controle de nível superior no WinForms é o Form.

Vários dos controles ‘puros’ do Winform, aqueles que fazem sua própria pintura em vez de deixar um controle nativo do Windows fazer o trabalho, suportam, no entanto, um BackColor transparente. Painel é um deles. Ele usa um truque, ele pede ao pai para desenhar-se para produzir os pixels de fundo. Um efeito colateral desse truque é que controles sobrepostos não funcionam, você só vê os pixels pai, não os controles sobrepostos.

Este exemplo de formulário mostra isso no trabalho:

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 isso não for bom o suficiente, você precisará considerar o empilhamento de formulários um sobre o outro. Assim .

Notável, talvez, é que essa restrição é levantada no Windows 8. Ele não usa mais o recurso de sobreposição do adaptador de vídeo e o DWM (também conhecido como Aero) não pode mais ser desligado. O que torna a opacidade / transparência em janelas filhas fácil de implementar. Confiar nisto é, naturalmente, a música do futuro por um tempo. Windows 7 será o próximo XP 🙂

Para quem ainda está procurando por um painel totalmente transparente, encontrei uma boa solução neste blog de William Smash que, por sua vez, tirou de Tobias Hertkorn em seu blog T # . Eu pensei que vale a pena publicá-lo como uma resposta aqui.

Código 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); } } 

Código 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 

Com base nas informações encontradas em http://www.windows-tech.info/3/53ee08e46d9cb138.php , consegui obter um controle de painel translúcido usando o seguinte código.

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

A ressalva é que quaisquer controles que são adicionados ao painel têm um fundo opaco. No entanto, o painel translúcido foi útil para bloquear partes do meu aplicativo WinForms para que o foco dos usuários fosse deslocado para a área apropriada do aplicativo.

Tanto quanto eu sei que um painel pode ter apenas uma cor transparente, você não pode controlar a opacidade do painel. Então, você pode ter algumas partes de um painel completamente transparentes, mas não 50% para dizer alguma coisa.

Para usar transparência, você deve definir a propriedade de cor transparente.

Tente isto:

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

mude o alfa (A) para obter a opacidade desejada.

Não se esqueça de trazer seu painel para o Front quando criar dinamicamente no construtor de formulário. Exemplo de sobreposição de painéis transparentes no controle de guias.

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

// <== caso contrário, os outros controles pintam por cima do painel transparente

Eu só queria adicionar à solução William Smash, pois não consegui chegar ao blog dele, então respostas que podem ter sido feitas para minhas perguntas simples não foram encontradas.

Demorei um pouco para perceber, mas talvez estivesse apenas tendo um momento …

Se você não teve que fazer isso, você precisará adicionar uma referência a System.Windows.Forms nas propriedades do projeto.

Você também precisará adicionar

 Imports System.Windows.Forms 

para o arquivo onde você está adicionando a class de substituição.

Para OnPaintBackground, você precisará adicionar uma referência para System.Drawing.

 Imports System.Drawing.Printing.PrintEventArgs 

Isso funciona para mim. No exemplo abaixo, o intervalo Alpha pode ser um valor entre 0 e 255. Anteriormente, cometi um erro ao pensar que deveria ser um valor percentual.

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

alguns comentários dizem que funciona e alguns dizem que não Funciona apenas para o seu fundo de form não para outros controls por trás

Intereting Posts