Panel transparent machen und die darunter liegenden Controls noch sehen

Snowcrack

Mitglied
Hallo zusammen,

ich habe ein Panel(Panel1) mit einem Hintergrundbild. Auf diesem sind mehrere Controls.
Wenn ich nun ein weiteres Panel(Panel2) auf Panel1 add und dieses transparent mache sehe ich die ganzen Controls auf Panel1 nicht mehr. Das einzige was ich durch die Transparents(von Panel2) sehe ist mein Hindergrundbild von Panel1.
Weis jemand wie ich es hinbekomme das ich auch die auf Panel1 liegenden Controls sehe(diese werden irgendwie trotz transparents von Panel2 verdeckt)?

thx
 
Hi Snowcrack!

Willkommen im Forum!

Schau doch mal in diesen [thread=252015]groupBox transparent machen - Thread[/thread]. Vielleicht findest darin schon deine Antwort...

Und in dem folgenden Thread ist ein netter Hack beschrieben, um die Transparenz zu erzwingen:
[thread=251310][VC++] Zeichenbefehle? Bessere anstelle von drawLine usw... - Thread[/thread]

Sag Bescheid wenn Du damit nicht klar kommst und erörtere was Du nicht verstehst.
 
Hallo Christian,

danke für die rasche Antwort :)

Ich habe mir die zwei Threads mal angeschaut, aber viel weiter haben sie mich nicht gebracht. Ich hab mal kurz eine Beispielsanwendung geschriebe(im Anhang ist eine Abbildung), in der ich mein wissen zu diesem Thema mal untergebracht habe.

Folgender Code wird ausgeführt wenn man Button "View panel one" drückt:
Code:
        private void ViewPnlOne_Click(object sender, EventArgs e)
        {
            Panel pnlOne = new Panel();
            pnlOne.BackColor = Color.FromArgb(80, Color.CornflowerBlue);
            pnlOne.Location = new Point(150, 50);
            pnlOne.Size = new Size(100, 100);
            pnlOne.BorderStyle = BorderStyle.FixedSingle;
            panelMain.Controls.Add(pnlOne);
            pnlOne.BringToFront();
        }

Nach diesem Code erscheint dann Panel 1



Dieser Code wird ausgeführt wenn man Button "View Panel Two" drückt:
Code:
        private void ViewPnlTwo_Click(object sender, EventArgs e)
        {
            CtlPanelTwo pnlTwo = new CtlPanelTwo();
            pnlTwo.Opacity = 80;
            pnlTwo.BrushColor = Color.CornflowerBlue;
            pnlTwo.Location = new Point(300, 150);
            pnlTwo.Size = new Size(100, 100);
            panelMain.Controls.Add(pnlTwo);
            pnlTwo.BringToFront();
        }

Das steht noch in dem Control das erzeugt wird:
Code:
   public partial class CtlPanelTwo : UserControl
    {
        public CtlPanelTwo()
        {

            InitializeComponent();

            this.brushColor = Color.Transparent;
            this.opacity = 100;
            this.delay = new Timer();
            this.delay.Tick += new EventHandler(this.TimerOnTick);
            this.delay.Enabled = true;
            this.delay.Interval = 50;
        }

        protected override void OnMove(EventArgs e)
        {
            base.RecreateHandle();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            int num1;
            Graphics graphics1 = e.Graphics;
            Rectangle rectangle1 = new Rectangle(0, 0, base.Width - 1, base.Height - 1);
            Color color1 = this.brushColor;
            if (color1 == Color.Transparent)
            {
                num1 = 0;
            }
            else
            {
                num1 = (this.opacity * 0xff) / 100;
            }
            Pen pen1 = new Pen(Color.Black);
            SolidBrush brush1 = new SolidBrush(Color.FromArgb(num1, color1));
            graphics1.FillRectangle(brush1, rectangle1);
            graphics1.DrawRectangle(new Pen(new Color()), rectangle1);
            pen1.Dispose();
            brush1.Dispose();
            graphics1.Dispose();
            this.BorderStyle = BorderStyle.None;
        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
        }

        private void TimerOnTick(object source, EventArgs e)
        {
            base.RecreateHandle();
            this.delay.Stop();
        }


        public Color BrushColor
        {
            get
            {
                return this.brushColor;
            }
            set
            {
                this.brushColor = value;
                base.RecreateHandle();
            }
        }

        protected override System.Windows.Forms.CreateParams CreateParams
        {
            get
            {
                System.Windows.Forms.CreateParams params1 = base.CreateParams;
                params1.ExStyle |= 0x20;
                return params1;
            }
        }

        public int Opacity
        {
            get
            {
                if (this.opacity > 100)
                {
                    this.opacity = 100;
                }
                else if (this.opacity < 0)
                {
                    this.opacity = 0;
                }
                return this.opacity;
            }
            set
            {
                this.opacity = value;
                base.RecreateHandle();
            }
        }


        private Color brushColor;
        private Timer delay;
        private int opacity;
    }

Nach diesem Code erscheint dann Panel 2.

So wie Panel2 sollte das Panel aussehen das ich führ meine richtige Anwendung benötige . Jedoch kann ich diesen Code nicht nehmen, da er sehr viel Performance schluckt. In meine richtigen Anwendung ist dieser Code so langsam, dass man zuschauen kann wie sich das Panel zeichnet und das ist nicht gut!

Desshalt meine Frage: Gibt es eine Möglichkeit ein Panel zubekommen wie Panel 2, mit nicht allzu komplexen Code. Jedoch muss dieser wesendlich Performanter laufen wie meiner.

Danke schon mal!

Gruß Snowcrack

PS: Panel1 kann ich nicht benutzen da man den darunterliegenden Button nicht sieht.
 

Anhänge

  • 27562attachment.jpg
    27562attachment.jpg
    36,8 KB · Aufrufe: 1.362

Neue Beiträge

Zurück