Пример установки наполовину прозрачного красного фона для кнопки
Если нужно чтобы было видно только изображение (не Control'ы), находящееся под ней, то достаточно у Panel'и выставить свойство BackColor в значение цвета, содержащее alpha-состовляющую в диапазоне 0 - 254. Вот пример установки наполовину прозрачного красного фона для кнопки:
button.BackColor = Color.FromArgb(125, Color.Red);
Только нужно иметь ввиду, что для того, чтобы Control поддерживал прозрачные цвета - у него должны быть выставлены стили ControlStyles.SupportsTransparentBackColor и ControlStyles.UserPaint. Например, у Button и Panel эти стили выставлены, а вот, например, у TextBox'а - нет. Если же нужно, чтобы под панелью было видно не только нарисованное изображение, но и низлежащие 'сестринские' (имеющие того же родителя) control'ы - у нее при создании нужно выставить стиль WS_EX_TRANSPARENT, указывающий окну, что сперва должны прорисоваться низлежащие окна:
class TransparentPanel : Panel { //Чтобы background не прорисовывался выставим флаг ControlStyles.Opaque: public TransparentPanel() { SetStyle(ControlStyles.Opaque, true); } //И добавим к окну, при его создании, стиль WS_EX_TRANSPARENT: protected override CreateParams CreateParams { get { const int WS_EX_TRANSPARENT = 0x00000020; CreateParams createParams = base.CreateParams; createParams.ExStyle |= WS_EX_TRANSPARENT; return createParams; } } //Теперь, чтобы панель была видна как полупрозрачная, необходимо переопределить ее метод OnPaint //и в нем закрашивать нужную облаcть цветом с alpha-составляющей: protected override void OnPaint(PaintEventArgs e) { e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.Green)), 0, 0, Width, Height); } //При перемещении такой 'прозрачной' панели (например, при установке свойства Control.Location) //можно заметить, что она, перемещаясь на новое место, остается с тем же background'ом, //что и на прежнем месте. Так происходит потому, что низлежащие окна не перерисовываются //в тех новых координатах, в которых находится наша Panel после перемещения, поэтому их нужно заставить обновиться: protected override void OnMove(EventArgs e) { if (Parent != null) Parent.Invalidate(Bounds, true); } } class TransparentPanelDemo : Form { TransparentPanel panel; public TransparentPanelDemo() { panel = new TransparentPanel(); panel.Size = new Size(50, 50); Button btMove1 = new Button(); btMove1.Text = "Move 1"; btMove1.Click += new EventHandler(OnButton1Click); Button btMove2 = new Button(); btMove2.Left = btMove1.Right * 2; btMove2.Text = "Move 2"; btMove2.Click += new EventHandler(OnButton2Click); Label lblText = new Label(); lblText.AutoSize = true; lblText.Text = "label1"; lblText.ForeColor = Color.Red; lblText.Top = btMove1.Bottom; Controls.AddRange(new Control[] { panel, btMove1, btMove2, lblText }); } void OnButton1Click(object sender, EventArgs e) { panel.Left = ((Control)sender).Right * 2; } void OnButton2Click(object sender, EventArgs e) { panel.Left = 0; } protected override void OnPaint(PaintEventArgs e) { e.Graphics.FillEllipse(Brushes.Yellow, 20, 20, 100, 100); } static void Main() { Application.Run(new TransparentPanelDemo()); } }
автор: mik-a-el