WinForm Controls + Прозрачность - PullRequest
1 голос
/ 26 февраля 2010

Не пугайтесь длины поста, это должно быть довольно простым. Я просто пытаюсь быть очень конкретным, потому что многие люди не поняли меня, когда я объяснил проблему раньше.

Я искал решение для этого, но я не совсем нашел то, что искал.

Я пытаюсь установить параметры прозрачности для нескольких вложенных элементов управления, которые динамически добавляются во время выполнения. Я попытался использовать общий прозрачный цвет программы, но кажется, что он рисует прозрачный слой ПОСЛЕ того, как он рисует элемент управления.

Мне нужно больше контроля над тем, какие слои являются прозрачными, чтобы я мог создавать слои панелей, элементы управления PictureBox с непрямоугольными изображениями и некоторые другие вещи. Я не могу нарисовать событие Image in Paint () (которое я сделал с большим успехом в другом месте), потому что эти PictureBox имеют клик, наведение мыши, контекстное меню и другие вещи, связанные с ними.

Так что есть ограничения.

В приведенном ниже примере предполагается, что WinForm имитирует книгу с «вкладками» для перехода к следующей «главе» и различной графикой, отображаемой «внутри книги». Важные технические подробности ниже. Изображение (слегка устаревшее)

FlowLayoutPanel FLP = Большая прямоугольная панель. Я хочу, чтобы он был «полностью прозрачным», потому что он используется только для своих возможностей FlowLayout и для чистого перемещения / изменения размера многих элементов управления. Он содержит следующие элементы управления.

1) Panel LeftTabs = Панель, содержащая LeftTabs.

2) Панель книг = Панель, содержащая множество дочерних элементов управления. Имеет фоновое изображение (здесь нет проблем с прозрачностью, но есть дочерние элементы управления).

3) Панель RightTabs = Панель, содержащая RightTabs.

***** Проблема 1: Прозрачные вкладки панелей ***** Панели вкладок содержат перекрывающиеся элементы управления PictureBox с закругленными углами - что-то вроде заполнения вкладок папок. Недостающие углы этих вкладок показывают фон элемента управления внизу, а не изображение следующей далее дальнейшей вкладки. На рисунке выше я все еще использовал упорядоченные PictureBox, но теперь я перемещаю вкладки в панели вкладок и хочу, чтобы фон этих был прозрачным.

***** Проблема 2: дочерние элементы управления на панели «Книга» ***** Элемент управления панели «Книга» содержит многочисленных дочерних панелей (дочерний слой 1), и каждая из этих содержит еще один PictureBox и переменное число элементов управления NumericUpDown (дочерний слой 2).
С NUD все в порядке, но PictureBox (CL2) имеет более закругленные углы.
Панели (CL1) должны быть полностью прозрачными (используя их только для группировки полномочий и логики), но эта прозрачность должна ОСТАНОВИТЬСЯ на уровне панели Book.

Надеюсь, все это имело смысл. В прошлом я пробовал множество исправлений, прежде чем сдаваться и разбираться с проблемой, но теперь я полон решимости сделать это правильно. Я пытался изменить формы элементов управления ([control] .Region), но это решение невероятно запутанно и делает будущие изменения (пользовательские скины) практически невозможными.

1 Ответ

2 голосов
/ 09 июля 2010

Короткая версия:

Я нашел способ обойти проблему.

Это связано с использованием REGION элемента управления.

Изменив Регион контроля, мне удалось подделать систему функциональной прозрачности. Возможно, это не самый эффективный или удобный метод, но он выполняет свою работу.

        int SizeW = this.Size.Width;
        int SizeH = this.Size.Height;
        int ArcSize = (int)((float)SizeW * 0.40 );

        if (tabType == TabType.LeftTab)
        {
            //Make a six-sided polygon, a rectangle with the "outside" corners cut off.
            //The next step will round the corners with Arcs
            Point[] points = new Point[] { 
                new Point(SizeW, 0), new Point(ArcSize, 0),
                new Point(0,ArcSize), new Point(0,SizeH-ArcSize), 
                new Point(ArcSize,SizeH), new Point(SizeW,SizeH)};
            Byte[] bytes = new byte[] { 
                1, 1, 
                1, 1, 
                1, 1};
            System.Drawing.Drawing2D.FillMode fm =
                System.Drawing.Drawing2D.FillMode.Winding;

            System.Drawing.Drawing2D.GraphicsPath tempGP =
                new System.Drawing.Drawing2D.GraphicsPath(points, bytes, fm);

            //add the arcs
            ArcSize = ArcSize * 2;
            tempGP.AddArc(0, 0, ArcSize, ArcSize, -90, -90);
            tempGP.CloseFigure();
            tempGP.AddArc(0, SizeH - ArcSize, ArcSize, ArcSize, 180, -90);
            tempGP.CloseFigure();

            Region tempRegion = new Region(tempGP);
            this.Region = new Region(tempGP);
        }
...