Как сделать более 1 прозрачного слоя Picturebox в C#? - PullRequest
0 голосов
/ 08 января 2020

Я использую 3 коробки с картинками. 1 как фон и 2 как прозрачный слой поверх фона. все с одинаковыми размерами. Слой 1 используется для рисования линий, а слой 2 - для рисования фигур. Я использую вкладку, чтобы контролировать, какой слой виден, а какой скрыт. но как-то не могу сделать оба слоя видимыми одновременно, хотя они оба прозрачные.

Код, который я использую

public Form1()
        {
            InitializeComponent();
            bgLayer.Image = bmp;
            bgLayer.Controls.Add(lineLayer);
            bgLayer.Controls.Add(squareLayer);
            lineLayer.Location = new Point(0, 0);
            squareLayer.Location = new Point(0, 0);
            lineLayer.BackColor = Color.Transparent;
            squareLayer.BackColor = Color.Transparent;
        }

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tabControl1.SelectedIndex == 0)
            {
                lineLayer.Visible = true;
                squareLayer.Visible = true;
                lineLayer.Enabled = false;
                squareLayer.Enabled = false;
            }
            else if (tabControl1.SelectedIndex == 1)
            {
                lineLayer.Visible = true;
                squareLayer.Visible = false;
                lineLayer.Enabled = true;
                squareLayer.Enabled = false;
            }
            else if (tabControl1.SelectedIndex == 2)
            {
                lineLayer.Visible = false;
                squareLayer.Visible = true;
                lineLayer.Enabled = false;
                squareLayer.Enabled = true;
            }
        }

Кто-нибудь знает, как сделать оба прозрачных слоя видимыми одновременно? вкладка 0 видна одновременно, 1 - только picturebox1 и 2 - только picturebox3. Управление вкладками 1 и 2 работает нормально, но 0 показывает только слой picturebox1.

попытался добавить lineLayer.Controls.Add(squareLayer);, но программа выполнит буферы без остановки при выполнении

1 Ответ

0 голосов
/ 09 января 2020

Это невозможно при использовании WinForm PictureBox: WinForms не поддерживает z-упорядочение альфа-смешанных (или даже индекс-прозрачность) элементов управления, как вы можете использовать WPF или HTML + CSS. Единственное, что он допускает, - это то, что элементы управления повторно визуализируют фон своих родительских Control, прежде чем они начнут рисовать сами (обратите внимание, что родительские элементы управления также обязательно обрезают и своих дочерних элементов, поскольку все подклассы Control в WinForms инкапсулируют hWnd User32. Единственный обходной путь - это создание нового окна верхнего уровня без области, не являющейся клиентом, что может быть болезненным).

Единственный обходной путь - иметь один элемент управления, который настраивается для перерисовки сложенных изображений внутри его. переопределить событие OnPaint или восстановить в памяти Bitmap каждый раз, когда вы хотите, чтобы внешний вид изменился и использовать один PictureBox См. здесь: Сделать перекрывающийся графический блок прозрачным в C#. net

...