Создание полупрозрачной Panel

369
12 апреля 2017, 11:31

Нужно, чтобы при нажатии на button появлялась panel поверх всех компонентов. Panel должна быть чёрного цвета и полупрозрачная. Как это сделать?

Answer 1

Могу предложить следующий вариант. Накидываем компонентов на форму, затем закидываем Panel в нужное место. Затем создаем отдельный класс, который наследует Panel, он нам понадобится для дальнейшей работы:

[System.ComponentModel.DesignerCategory("")] // чтобы дизайнер формы работал
public class ExtendedPanel : Panel
{
    private const int WS_EX_TRANSPARENT = 0x20;
    public ExtendedPanel()
    {
        SetStyle(ControlStyles.Opaque, true);
    }
    private int _opacity; // прозрачность 
    public int Opacity
    {
        get { return this._opacity; }
        set
        {
            if (value < 0 || value > 100) // процентов от 0 до 100
                throw new ArgumentException("Значение должно быть от 0 до 100");
            this._opacity = value;
        }
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
            return cp;
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    { 
        // Color.Black - вот он наш черный цвет панели полупрозрачный
        using (var brush = new SolidBrush(Color.FromArgb(this._opacity * 255 / 100, Color.Black)))
        {
            e.Graphics.FillRectangle(brush, this.ClientRectangle);
        }
        base.OnPaint(e);
    }
}

Переходим в дизайнер формы, там где определены наши компоненты. Здесь нам нужно в двух местах изменить значение нашего panel1, а именно в методе InitializeComponent делаем так:

this.panel1 = new ExtendedPanel();

И в объявлении полей класса Form1 тоже ставим свой тип:

private ExtendedPanel panel1;

В конструктор формы прописываем следующее:

public Form1()
{
    InitializeComponent();
    panel1.Hide(); // скрываем нашу панель изначально
}

Добавляем на форму кнопку и вешаем на нее обработчик:

private void button1_Click(object sender, EventArgs e)
{
    panel1.BringToFront(); // на первый план
    panel1.Opacity = 50; // задаем прозрачность в процентах
    panel1.Show(); // показываем
}

Теперь, после нажатия на кнопку будет полупрозрачная панель.

  • Метод Color.FromArgb (Int32, Color) Создает цвет структуры из указанного Color, с новым определенным значением alpha. Чтобы создать непрозрачный цвет, установите alpha до 255. Чтобы создать полупрозрачный цвет, установите alpha любое значение от 1 до 254.

  • Метод Control.BringToFront помещает элемент управления в начало z-порядка. Если элемент управления является дочерним для другого элемента управления, дочерний элемент управления перемещается в начало z порядка.

  • ControlStyles.Opaque - если присвоено значение true, элемент
    управления отображается непрозрачным, а фон не закрашивается.

Ссылка на источник: Any trick to use opacity on a panel in Visual Studio Window Form?

READ ALSO
C# парсинг IP с разными октетами

C# парсинг IP с разными октетами

Здравствуйте, задача написать регулярное выражение для выборки данных следующим образом: в результате должны остаться правильные IP-адреса...

254
Как сделать сортировку в столбцах у `ListView`?

Как сделать сортировку в столбцах у `ListView`?

Собственно есть listview, как сделать сортировку по данным в столбцах? Есть столбец процессов - нужно по нажатию на колонку, сделать сортировку...

367
Ошибка при запуске проекта ASP. NET Core 1.1

Ошибка при запуске проекта ASP. NET Core 1.1

При запуске проекта появляется окно со следующей ошибкой "ошибка при попытке определить идентификатор процесса dotnetexe", запускаю на IIS в 17 студии

182
Удалить пустые столбцы DataGridView

Удалить пустые столбцы DataGridView

Есть таблица DataGridView с контактамиКаждый столбец - способ связи (телефон, почта, ваттсапп ect)

524