Пример установки наполовину прозрачного красного фона для кнопки

Если нужно чтобы было видно только изображение (не Control'ы), находящееся под ней, то достаточно у Panel'и выставить свойство BackColor в значение цвета, содержащее alpha-состовляющую в диапазоне 0 - 254. Вот пример установки наполовину прозрачного красного фона для кнопки:

code: #csharp
button.BackColor = Color.FromArgb(125, Color.Red);

Только нужно иметь ввиду, что для того, чтобы Control поддерживал прозрачные цвета - у него должны быть выставлены стили ControlStyles.SupportsTransparentBackColor и ControlStyles.UserPaint. Например, у Button и Panel эти стили выставлены, а вот, например, у TextBox'а - нет. Если же нужно, чтобы под панелью было видно не только нарисованное изображение, но и низлежащие 'сестринские' (имеющие того же родителя) control'ы - у нее при создании нужно выставить стиль WS_EX_TRANSPARENT, указывающий окну, что сперва должны прорисоваться низлежащие окна:

code: #csharp
 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

Поделиться:

Похожие статьи: